728x90
반응형
문제 출처 : https://www.acmicpc.net/problem/9095
풀이
DP 기초 문제이다.
10 이하의 정수를 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 문제이다.
dp[i]를 i 를 1, 2, 3 으로 나타내는 방법의 수라고 하자.
dp[1]은 1로만 나타낼 수 있으므로 1,
dp[2]는 2, 1+1 이므로 2,
dp[3]은 3, 2+1, 1+2, 1+1+1 이므로 4이다.
※ 2, 3의 경우도 점화식으로 나타낼 수 있는데,
dp[2] = dp[1] + 1(2로 나타낼 수 있으므로)
dp[3] = dp[1] + dp[2] + 1(3으로 나타낼 수 있으므로) 이다.
4 이후 부터는 1, 2, 3의 조합으로만 나타낼 수 있다.
문제에 나와있는 4의 조합을 확인하기 전에 1, 2, 3의 조합을 확인해 보자.
- 1
- 1+1
- 2
- 1+1+1
- 1+2
- 2+1
- 3
4의 조합을 확인해보면
- 1 +3
- 1+1 +2
- 2 +2
- 1+1+1 +1
- 1+2 +1
- 2+1 +1
- 3 +1
눈채챘는가? 그렇다! 결국 dp[1], dp[2], dp[3]의 방법의 수에 각각 3, 2, 1만큼 더해준 것이다.
따라서 방법의 수인 dp[4] = dp[1] + dp[2] + dp[3]이 되고, 점화식은 다음과 같다.
dp[i] = dp[i-1] + dp[i-2] + dp[i-3]; // i > 3일때
코드
dp[10]까지의 방법의 수를 미리 계산한 후 출력하였다.
#include <iostream>
#include <vector>
using namespace std;
int main(){
ios::sync_with_stdio(false); cin.tie(NULL);
int T;
cin >> T;
int dp[11] = {0, };
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
for(int i = 4; i <= 10; i++)
dp[i] = dp[i-1] + dp[i-2] + dp[i-3];
while (T--){
int num;
cin >> num;
cout << dp[num] << '\n';
}
return 0;
}
728x90
반응형
'Tech > Algorithm' 카테고리의 다른 글
[BOJ] 백준 11052 카드 구매하기 c++ (DP) (0) | 2022.01.04 |
---|---|
[BOJ] 백준 15486 퇴사 2 c++ (DP) (0) | 2022.01.02 |
[BOJ] 백준 9084 동전 c++ (DP) (0) | 2021.12.28 |
[BOJ] 백준 12865 평범한 배낭 c++ (냅색 알고리즘, Knapsack, DP) (2) | 2021.12.27 |
[BOJ] 백준 1764 듣보잡 c++ (문자열, map, unordered_map) (0) | 2021.12.22 |