Problem Solving/BOJ
[BOJ] 2225 : 합분해
shyram
2018. 12. 30. 19:57
이전의 경우의 수에 N 이하의 값을 더한다고 해보자.
N = 3, K = 2 에서 다음과 같은 경우가 가능하다.
0 + 3
1 + 2
2 + 1
3 + 0
N = 3, K = 3 에서 다음과 같은 경우가 가능하다.
(0+0) + 3
(0+1, 1+0) + 2
(0+2, 1+1, 2+0) + 1
(0+3, 1+2, 2+1, 3+0) + 0
이를 수식으로 표현하면 아래과 같다.
$$DP[N][K] = \sum_{i=0}^{N} DP[i][K-1]$$
모든 N에 대해서 k=1 일때, 다음이 성립한다.
$$DP[N][1] = 1$$
초기화를 해준 뒤에, 3중 for문으로 각 DP[i][j]의 값을 구한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <bits/stdc++.h> using namespace std; #define MOD 1000000000 int dp[201][201]; int main(void) { ios::sync_with_stdio(0); cin.tie(NULL); int n, k; cin >> n >> k; for (int i = 0; i <= n; i++) dp[i][1] = 1; for (int i = 0; i <= n; i++) { for (int j = 2; j <= k; j++) { for (int z = 0; z <= i; z++) { dp[i][j] += dp[z][j - 1]; dp[i][j] %= MOD; } } } cout << dp[n][k]; } | cs |