※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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
'BOJ' 카테고리의 다른 글
[BOJ 1646 // C++] 피이보나치 트리 (0) | 2022.07.07 |
---|---|
[BOJ 2041 // C++] 숫자채우기 (0) | 2022.07.06 |
[BOJ 5052 // C++] 전화번호 목록 (0) | 2022.07.04 |
[BOJ 14714 // C++] 홍삼 게임 (Easy) (0) | 2022.07.03 |
[BOJ 23254 // C++] 나는 기말고사형 인간이야 (0) | 2022.07.03 |