반응형
https://www.acmicpc.net/problem/2225
본 문제는 0 ~ N까지 정수 K개를 더해서 그 합이 N이 되는 경우의 수를 구하는 문제다. 덧셈의 순서가 바뀐 경우는 다른 경우로 센다(1+2와 2+1은 서로 다른 경우). 큰 문제를 작은문제로 나누어 해결할 수 있기 때문에 DP문제이고, d[n][k] = d[n-0][k-1] + d[n-1][k-1] + d[n-2][k-1] + ... + d[n-n][k-1] 으로 점화식을 정의 할 수 있다. Bottom-up 방법을 사용하였고, 미지수가 3개이므로 3중 for문을 사용했다. 사실 DP를 풀기전에 완전탐색을 이용하여 해결하려고 하였으나, 재귀를 이용하여 1+2, 2+1을 서로 다른 경우의 수로 계산하기가 조금 껄끄러웠다.
Bottom-up
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include <cstdio>
using namespace std;
long long d[201][201];
int main() {
const long long Mod = 1000000000LL;
int n, k;
scanf("%d %d", &n, &k);
d[0][0] = 1LL;
for (int j = 1; j <= k; j++) {
for (int i = 0; i <= n; i++) {
for (int x = 0; x <= i; x++) {
d[i][j] += d[i-x][j-1];
d[i][j] %= Mod;
}
}
}
printf("%lld", d[n][k]);
}
|
cs |
반응형
'백준' 카테고리의 다른 글
[백준 17087] 숨바꼭질 6, C++ (0) | 2020.01.13 |
---|---|
[백준 9613] GCD 합, C++ (0) | 2020.01.13 |
[백준] 1699 - 제곱수의 합, C++ (0) | 2020.01.12 |
[백준] 1912 - 연속합, C++ (0) | 2020.01.12 |
[백준 14002] 가장 긴 증가하는 부분 수열 4, C++ (0) | 2020.01.12 |
댓글