※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 11058번 문제인 크리보드이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/11058 

 

11058번: 크리보드

N = 3인 경우에 A, A, A를 눌러 A 3개를 출력할 수 있다. N = 7인 경우에는 A, A, A, Ctrl-A, Ctrl-C, Ctrl-V, Ctrl-V를 눌러 9개를 출력할 수 있다. N = 11인 경우에는 A, A, A, Ctrl-A, Ctrl-C, Ctrl-V, Ctrl-V, Ctrl-A, Ctrl-C, Ctrl

www.acmicpc.net

dp[i]를 (i번 키를 눌러 만들어진 문자열의 최대 길이)로 하자.

 

이 때, dp[i]는 (1) dp[i-1]의 문자열에 A를 눌러 길이를 하나 늘린 길이나 (2) 1이상 i-3 이하의 숫자 k에 대해서 dp[k]를 복사해 (i-k-2)회 복사해 붙여넣은 길이들 중 최댓값으로 구할 수 있게 된다.

 

위 점화식을 구현해 문제를 해결하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;
typedef long long ll;

ll dp[101];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	dp[0] = 0;
	ll N; cin >> N;
	for (ll i = 1; i <= N; i++) {
		dp[i] = dp[i - 1] + 1;
		for (ll k = i - 3; k > 0; k--) dp[i] = max(dp[i], dp[k] * (i - k - 1));
	}

	cout << dp[N];
}
728x90

+ Recent posts