https://www.acmicpc.net/problem/2668



n번째 자리에서 끝자리에 있는 숫자에 따라 값을 저장해주면 되는 문제이다.


예를들어

n이 2일때 끝의 자리가 1인 경우의 수는 n이 1일때 끝의 자리가 0과 1일때의 경우와 같다.

n이 2일때 끝의 자리가 9인 경우의 수는 n이 1일때 끝의 자리가 0부터 9까지의 경우와 같다.



즉 다음과 같은 점화식을 세울 수 있다.

dp[n][j] = dp[n-1][0]+...+dp[n-1][j]

(n자리에서 끝이 j일때 경우의 수)



주의할 점은 자료형을 int로 하면 값의 범위에 벗어나기 때문에

long으로 정답을 출력해주면 된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <vector>
using namespace std;
 
int main(){
    
    int T;
    cin>>T;
    
    int n;
    for(int testCase=0;testCase<T;testCase++){
        scanf("%d",&n);
        
        long ans=0;
        vector<vector<long>> dp(n+1,vector<long> (10,0));
        for(int k=0;k<10;k++)
            dp[1][k]=1;
        
        for(int i=2;i<=n;i++)
            for(int j=0;j<10;j++)
                for(int k=0;k<=j;k++)
                    dp[i][j]+=dp[i-1][k];
        
        for(int k=0;k<10;k++)
            ans+=dp[n][k];
        
        printf("%ld\n",ans);
        
    }
    return 0;
}
cs


'알고리즘(BOJ) > DP' 카테고리의 다른 글

백준 5557번 - 1학년  (0) 2019.06.18
백준 4811번 - 알약  (0) 2019.04.20
백준 5582번 - 공통 부분 문자열  (1) 2019.03.25
백준 1915번 - 가장 큰 정사각형  (0) 2018.10.09
백준 2225번 - 합분해  (0) 2018.04.01

+ Recent posts