https://www.acmicpc.net/problem/9095
정답률이 64%에 이르는 비교적 쉬운 난이도의 문제이다.
만약 조건에서 n이 1,2,3의 합이 아닌 더욱 큰 범위까지 이른다면 조금 더 어려워지지 않았을까 싶다.
문제를 보면서 dp를 생각했었는데 4까지의 합을 구할 때 3까지의 합에서 1을 더해주는 방법을 생각하게 되었다.
그런데 3까지의 합에서 1을 더해주는 것으로 모든 경우를 구할 수 없어서 고민을 했다.
4일 때는 3까지 구한 값에서 '3가지'의 경우가 더 생기고, 5일 때는 4까지 구한 값에서 '6가지'의 경우가 더 생겨서 고민을 하다가 문제의 조건이 1,2,3의 합인 것을 보고 바로 해결할 수 있었다.
이 문제의 포인트는 1,2,3의 합으로 이루어진 경우를 생각하는 것이다.
즉 n 번째에서 1,2,3의 합으로 이루어진 경우는
n-1 번째에서 각각의 값에 1을 더하는 경우
n-2 번째에서 각각의 값에 2를 더하는 경우
n-3 번째에서 각각의 값에 3을 더하는 경우로 나타낼 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <iostream> #include <vector> using namespace std; int main(){ int n,testCase; cin>>testCase; for(int t=0;t<testCase;t++){ cin>>n; int dp[11]={0}; dp[1]=1, dp[2]=2, dp[3]=4; for(int i=4;i<=n;i++) dp[i]=dp[i-3]+dp[i-2]+dp[i-1]; cout<<dp[n]<<endl; } return 0; } | cs |
'알고리즘(BOJ) > DP' 카테고리의 다른 글
백준 2156번 - 포도주 시식 (0) | 2018.01.25 |
---|---|
백준 11726번 - 2xN 타일링 (0) | 2018.01.25 |
백준 2193번 - 이친수 (0) | 2018.01.25 |
백준 1149번 - RGB거리 (0) | 2018.01.25 |
백준 1463 - 1로 만들기 (2) | 2018.01.24 |