백준 15989 - 1, 2, 3 더하기 4
생각 및 접근
- 숫자 n을 1, 2, 3으로 더하되, 중복되지 않는 가짓수를 구하는 문제다.
- 정수
i
를 만들 때 오름차순으로만 더할 수 있다고 가정하고,dp[i][j]
를 정수i
를 만들 때 마지막으로 더한 수가j
인 경우의 수를 저장하였다. - 정수
i
를 만들 때의 case 분류- 기존 값에서
i
를 만들기 위해 더할 수 있는 수가 1인 경우- 기존 값의 마지막 수가 1이 되어야 한다.
dp[i][1] = dp[i - 1][1];
- 기존 값에서
i
를 만들기 위해 더할 수 있는 수가 2인 경우- 기존 값의 마지막 수가 1 또는 2가 되어야 한다.
dp[i][2] = dp[i - 2][1] + dp[i - 2][2];
- 기존 값에서
i
를 만들기 위해 더할 수 있는 수가 3인 경우- 기존 값의 마지막 수가 1 또는 2 또는 3이 되어야 한다.
dp[i][3] = dp[i - 3][1] + dp[i - 3][2] + dp[i - 3][3];
- 기존 값에서
코드
#include <bits/stdc++.h>
using namespace std;
int cases, n;
long long dp[10001][4];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
dp[1][1] = 1;
dp[2][1] = 1; dp[2][2] = 1;
dp[3][1] = 1; dp[3][2] = 1; dp[3][3] = 1;
for (int i = 4; i <= 10000; i++) {
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];
}
cin >> cases;
while (cases--) {
cin >> n;
cout << dp[n][1] + dp[n][2] + dp[n][3] << endl;
}
}
채점 결과
'Coding Test > acmicpc' 카테고리의 다른 글
백준 12865 - 평범한 배낭 (c++) (0) | 2020.08.15 |
---|---|
백준 1149 - RGB거리 (c++) (0) | 2020.08.15 |
백준 1890 - 점프 (c++) (0) | 2020.08.10 |
백준 11048 - 이동하기 (c++) (0) | 2020.08.10 |
백준 2580 - 스도쿠 (c++) (0) | 2020.08.09 |