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


[알고리즘풀이]

Dp[i][j] : 숫자 j 를 i 개의 숫자로 표현할 수 있는 경우의 수.

그럼 다음과 같은 방정식이 성립한다.

Dp[i][j] = Dp[1][j - 1] + Dp[2][j - 1] +  + Dp[i][j-1]

#include<iostream>

using namespace std;

#define m 1000000000;
int dp[201][201];

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0);

	int n, k;
	cin >> n >> k;
	for (int j = 0; j <= n; j++)
		dp[1][j] = 1;
	for (int j = 0; j <= k; j++)
		dp[j][0] = 1;

	for(int i = 2; i <= k; i++){
		for (int j = 1; j <= n; j++) {
			int temp = 0;
			for (int k = 1; k <= i; k++)
				temp = (temp +  dp[k][j - 1]) % m;
			dp[i][j] = temp % m;
		}
	}
	cout << dp[k][n];
}

 

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ] 1456 - 거의 소수  (0) 2019.10.03
[BOJ] 1715 - 카드 정렬하기  (0) 2019.10.02
[BOJ] 1914 - 하노이 탑  (0) 2019.10.01
[BOJ] 2003 - 수들의 합  (0) 2019.09.30
[BOJ] 10819 - 차이를 최대로  (0) 2019.09.30

+ Recent posts