반응형
dp로 푼 문제였습니다.
풀이방법
* 200까지의 수를 200개까지 뽑을 수 있기 때문에 순열로 접근하시면 시간초과를 맛볼 수 있습니다.
1. k개로 n을 만드는 경우의 수를 저장할 d배열을 선언해줍니다.
2. k-1개로 n-x수를 만드는 경우의 수들을 모두 더한다면 마지막으로 x를 사용했을 때 n을 만들 수 있습니다. 따라서 점화식을 세우면 다음과 같습니다.
d[i][j] = sum(d[i-1][0 ~ j ~ n])
Code
#include <bits/stdc++.h>
#define MOD 1'000'000'000
#define ll long long
using namespace std;
ll n,k;
ll d[201][201];
ll dp(ll k, ll n){
if(k == 1) return 1;
ll &ret = d[k][n];
if(ret != -1) return ret;
ret = 0;
for(ll t = 0; t <= n; t++) ret += dp(k-1,t) % MOD;
return ret % MOD;
}
int main(){
cin >> n >> k;
memset(d,-1,sizeof(d));
cout << dp(k,n) << '\n';
}
'Algorithm > DP(Dynamic Programing)' 카테고리의 다른 글
(C++) - 백준(BOJ) 2096번 : 내려가기 (0) | 2021.05.11 |
---|---|
(C++) - 백준(BOJ) 15988번 : 1, 2, 3 더하기 3 (0) | 2021.05.03 |
(C++) - 백준(BOJ) 21318번 : 피아노 체조 (0) | 2021.04.08 |
LCS(Longest Common Subsequence) (0) | 2021.03.31 |
(C++) - 백준(BOJ) 2565번 : 전깃줄 (0) | 2021.03.30 |