문제
https://www.acmicpc.net/problem/11058
문제 요약
크리보드라는 키보드에는 버튼이 4개만 존재한다.
A: 화면에 A를 출력한다.
Ctrl A: 화면을 전체 선택한다.
Ctrl C: 전체 선택한 내용을 버퍼에 복사한다.
Ctrl V: 버퍼가 비어있지 않은 경우, 화면에 출력된 문자열의 바로 뒤에 버퍼의 내용을 붙여 넣는다.
버튼을 N번 눌러 화면에 출력된 A 개수의 최대를 출력한다.
코드
#include <iostream>
# define ll long long
using namespace std;
ll n;
ll dp[110];
int main() {
// 입출력 단축 코드
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 1; i < 7; i++) {
dp[i] = i;
}
for (int i = 7; i <= n; i++) {
dp[i] = max(dp[i - 4] * 3, dp[i - 3] * 2);
dp[i] = max(dp[i], dp[i - 5] * 4);
}
cout << dp[n];
return 0;
}
코드 설명
Bottom Up DP를 통해 문제를 해결한다.
N을 1부터 차근차근 늘려가면, N이 6일 때까지는 A만 출력하는 것이 최대임을 알 수 있다.
N이 7이상일 경우부터는 Ctrl A, Ctrl C, Ctrl V를 한 묶음으로 생각하고 경우의 수를 따지면 된다.
dp[i]를 버튼을 i번 눌렀을 때, 최대 A 출력 수라고 정의하면,
dp[i - 5] * 4, dp[i - 4] * 3, dp[i -3] * 2 중 최대가 된다.
dp[i - 5] * 4
=> i - 5번 버튼을 눌러 출력한 A 최대 수에서 Ctrl A + Ctrl C + Ctrl V + Ctrl V + Ctrl V를 진행하여 A의 개수를 4배로 증가시킨 값이다.
dp[i - 4] * 3
=> i - 4번 버튼을 눌러 출력한 A 최대 수에서 Ctrl A + Ctrl C + Ctrl V + Ctrl V를 진행하여 A의 개수를 3배로 증가시킨 값이다.
dp[i - 3] * 2
=> i - 3번 버튼을 눌러 출력한 A 최대 수에서 Ctrl A + Ctrl C + Ctrl V를 진행하여 A의 개수를 2배로 증가시킨 값이다.
'Algorithm Problems > 다이나믹 프로그래밍' 카테고리의 다른 글
[백준/C++] 11052번: 카드 구매하기 (1) | 2024.09.13 |
---|---|
[백준/C++] 1904번: 01타일 (1) | 2024.09.09 |
[백준/C++] 17485번: 진우의 달 여행 (Large) (1) | 2024.08.06 |
[백준/C++] 10942번: 팰린드롬? (0) | 2024.07.27 |
[백준/C++] 2342번: Dance Dance Revolution (1) | 2024.07.12 |