Study hard
(c++)백준 15989번: 1, 2, 3 더하기 4 본문
15989번: 1, 2, 3 더하기 4
정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 4가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 합을 이루고 있는 수의 순서만 다른 것은 같은 것으로 친다. 1+1+1+1 2+1+1 (1+1+2, 1+2+1) 2+2
www.acmicpc.net

[풀이]
DP로 풀 수 있는 문제였다.
중복을 피하기 위해 오름차순으로만 더한다.
DP[i][1]: 정수 i를 만들 때 1로 끝나는 경우 -> 그 이전에 1만 올 수 있다.
DP[i][2]: 정수 i를 만들 때 2로 끝나는 경우 -> 그 이전에 1과 2가 올 수 있다.
DP[i][3]: 정수 i를 만들 때 3으로 끝나는 경우 -> 그 이전에 1과 2와 3이 올 수 있다.
DP[i][1] = DP[i-1][1]
DP[i][2] = DP[i-2][1] + DP[i-2][2]
DP[i][3] = DP[i-3][1] + DP[i-3][2] + DP[i-3][3]
#include <iostream>
#define Max 10001
using namespace std;
int DP[Max][4] = { 0, };
int curN = 0;
int T;
void solution() {
DP[0][1] = 1;
DP[1][1] = 1;
for (int i = 2; i <= 10000; i++) {
DP[i][1] = DP[i - 1][1];
DP[i][2] = DP[i - 2][1] + DP[i - 2][2];
if (i >= 3)
DP[i][3] = DP[i - 3][1] + DP[i - 3][2] + DP[i - 3][3];
}
}
int main() {
int n;
cin >> T;
solution();
curN = 3;
while (T--) {
cin >> n;
cout << DP[n][1] + DP[n][2] + DP[n][3] << '\n';
}
return 0;
}
'백준 > DP' 카테고리의 다른 글
(c++)백준 12865번: 평범한 배낭 (0) | 2020.09.15 |
---|---|
(c++)백준 11066번: 파일 합치기 (0) | 2020.09.15 |
(c++)백준 10942번: 팰린드롬? (0) | 2020.09.14 |
(c++)백준 15486번: 퇴사 2 (0) | 2020.09.14 |
(c++)백준 14501번: 퇴사 (0) | 2020.09.14 |