반응형

문제 출처 :


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



알고리즘 분석 :


문제 해결에 필요한 사항

1. Dynamic Programming

2. 점화식 세우는 방법


매우 다양한 점화식이 나올 수 있는 문제이다.


n을 1~n의 수를 k개를 이용하여 구하는 방법을 DP[n][k]라 하자.


DP[n][k] = DP[n-1][k] + DP[n][k-1]로 정의 할 수 있다.


n = 20, k = 2라 하면


즉, 20을 1~20의 수 2개를 이용한다면


1~19중 2개를 이용하여 19가 된 수(DP[19][2])에서 + 1을 해주면 DP[20][2]가 될 것이고 

1~20중 1개를 이용하여 20이 된 수(DP[20][1])에서 + 0을 해주면 DP[20][2]가 될 것이다.


이 방식을 이용하여 점화식을 구성하고 for문을 돌리면 해답을 얻을 수 있다.



소스 코드 : 


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 <cstdio>
 
using namespace std;
 
typedef long long ll;
 
ll DP[201][201];
 
int main()
{
    int n, k;
    scanf("%d %d"&n, &k);
 
    for (int i = 1; i <= n; i++)
        DP[i][1= 1;
    
    for (int i = 1; i <= k; i++)
        DP[1][i] = i;
 
    for (int i = 2; i <= n; i++)
        for (int j = 2; j <= k; j++)
            DP[i][j] = DP[i - 1][j] + DP[i][j - 1] % 1000000000;
        
    printf("%lld", DP[n][k] % 1000000000);
    
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus


반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

[1298번] 노트북의 주인을 찾아서  (2) 2017.03.22
[1405번] 미친 로봇  (4) 2017.03.22
[10942번] 팰린드롬?  (0) 2017.03.19
[1325번] 효율적인 해킹  (0) 2017.03.19
[10825번] 국영수  (0) 2017.03.18