728x90
시간제한 : 2초
메모리 제한 : 128MB
입력
첫째 줄에 두 정수 N(1 ≤ N ≤ 200), K(1 ≤ K ≤ 200)가 주어진다.
출력
첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다.
소스코드
#include <iostream> #include <vector> using namespace std; int main(void) { int N, K, mod = 1000000000; cin >> N >> K; vector<vector<long long> > dp(201, vector<long long>(201, 0)); for (int i = 0; i <= N; i++) dp[1][i] = 1; for (int i = 2; i <= K; i++) for (int j = 0; j <= N; j++) for (int l = 0; l <= j; l++) dp[i][j] = (dp[i][j] + dp[i - 1][l]) % mod; cout << dp[K][N]; }
Tip
dp[i][j]는, 0부터 i까지의 정수를 j개 더해서 i를 만드는 경우의 수를 뜻하며, dp[1][i]는 모두 1로 볼 수 있다. 이 상황에서, dp[i][j]는 dp[i-1][0]부터 dp[i-1][j]까지의 합을 바탕으로 값을 구할 수 있다. 왜 그런지는 숫자를 나열해보면서 확인해보는 것이 좋다.
728x90
'Computer Science > Algorithm Problem' 카테고리의 다른 글
백준] 2583 - 영역 구하기(한국정보올림피아드 2006; KOI 2006) (0) | 2019.03.25 |
---|---|
백준] 5556 - 타일(일본정보올림피아드 2011;JOI 2011) (0) | 2019.03.24 |
백준] 10451 - 순열 사이클(ACM-ICPC Regionals Daejeon) (0) | 2019.03.17 |
백준] 1406 - 에디터(CHCI 2004) (0) | 2019.03.13 |
백준] 14582 - 오늘도 졌다(2017 고려대학교 프로그래밍 대회) (0) | 2019.03.12 |