[BOJ] 2225. 합분해
문제
0부터 N까지의 정수 K개를 더해서 그 합이 N이 되는 경우의 수를 구하는 프로그램을 작성하시오.
덧셈의 순서가 바뀐 경우는 다른 경우로 센다(1+2와 2+1은 서로 다른 경우). 또한 한 개의 수를 여러 번 쓸 수도 있다.
입력
첫째 줄에 두 정수 N(1 ≤ N ≤ 200), K(1 ≤ K ≤ 200)가 주어진다.
출력
첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다.
예제 입력 1
20 2
예제 출력 1
21
문제를 아무리 읽어도 감이 안왔다. 언제쯤 dp 문제에 감을 익힐 수 있을까 ..
질문글도 몇개 읽어봐도 모르겠어서 구글링을 계속 했다. 몇가지 해설을 봤지만 아무리 해도 이해가 안됐다. 그러다 표를 그려보신 분을 찾아서 나도 표를 그려봤다. 역시 안될때는 그림으로 이해하는게 최고인 것 같다..
점화식은 간단하다.
dp[n][k] = dp[n][k-1] + dp[n-1][k]
코드>>
#include <iostream>
#define MOD 1000000000
using namespace std;
long long dp[201][201]={0,};
int main(){
int N,K;
cin>>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][j-1] + dp[i-1][j];
dp[i][j] %= MOD;
}
}
cout<<dp[N][K];
}
| cs |
No comments: