끄적끄적 코딩
article thumbnail
Published 2019. 11. 26. 21:49
[C++] 백준 11058번 크리보드 알고리즘

다이나믹 프로그래밍 문제입니다.

7번까지는 1번(A를 누름)만 누르는 것이 최대입니다.
그 후로는 2가지를 비교합니다.
1.   2, 3, 4(전체 붙여 넣기)
2.   2, 3, 4, 4, 4 ... (복사한것 계속 붙여 넣기)

2번의 경우 계속 붙여넣는것은 3번정도만 비교해주면 충분합니다.
그러면 다음과 같은 4개를 구할 수 있고 이를 비교해서 큰값을 넣어주면 됩니다.

DP[i-1] + 1 (A만 누르는 경우)
DP[i-3] * 2 (3칸전 값 전체 복사 붙여넣기)
DP[i-4] * 3 (4칸전 값 전체 복사 붙여넣기 * 2)
DP[i-5] * 4 (5칸전 값 전체 복사 붙여넣기 * 3)

#include<iostream>
#include<algorithm>
typedef long long ll;

using namespace std;

int main(int argc, char *argv[]) {
	int n;
	int maxNum;
	ll DP[101];

	cin >> n;

	DP[0] = 0;
	DP[1] = 1;
	DP[2] = 2;
	DP[3] = 3;
	DP[4] = 4;
	DP[5] = 5;

	for (int i = 6; i <= n; i++) {
		DP[i] = max({ DP[i - 1] + 1, DP[i - 3] * 2, DP[i - 4] * 3, DP[i - 5] * 4 });
	}

	cout << DP[n] << endl;

	return 0;
}

'알고리즘' 카테고리의 다른 글

[C++] 백준 13904번 과제  (0) 2019.11.27
[C++] 백준 2457번 공주님의 정원  (1) 2019.11.26
[C++] 백준 4781번 사탕 가게  (0) 2019.11.26
[C++] 백준 15988번 1, 2, 3 더하기 3  (0) 2019.11.26
[C++] 백준 8980번 택배  (0) 2019.11.24

검색 태그