N/K | 1 | 2 | 3 | 4 |
1 | 1 | 2 | 3 | 4 |
2 | 1 | 3 | 6 | 10 |
3 | 1 | 4 | 10 | 20 |
4 | 1 | 5 | 15 | 35 |
DP[N][K]: 0๋ถํฐ N๊น์ง์ ์ ์ ์ค์์ K๊ฐ์ ์๋ก N์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์
DP[1][1]๋ถํฐ DP[4][4]๊น์ง์ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํด๋ณด๋ฉด, ์ผ๋ฐํ๋ ์ ํ์์ ๊ตฌํ ์ ์๋ค.
DP[i][1] = 1 : ๋ชจ๋ ์ N์ ๋ํ์ฌ K = 1์ผ ๋ ๊ฒฝ์ฐ์ ์๋ 1์ด๋ค.
DP[1][i] = i : ๋ชจ๋ ์ 1์ ๋ํ์ฌ K = i์ผ ๋ ๊ฒฝ์ฐ์ ์๋ i์ด๋ค.
N = 2, K = 2๋ถํฐ๋ DP[N][K] = DP[N-1][K] + DP[N][K-1] ๋ผ๋ ์ ํ์์ ๊ฐ์ง ์ ์๋ค.
j์ ๋ฒ์๋ K ์ดํ๊น์ง์ด๋ค. (๊ทธ ์ดํ๋ก ๋๋ฉด out of range๋ก ์ฐ๋ ๊ธฐ ๊ฐ์ด ๋์จ๋ค..)
๋งค DP[i][j]๋ง๋ค 1000000000์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๊ฐ์ผ๋ก ์ค๋ค.
#include <stdio.h>
int main(){
int N, K;
scanf("%d %d", &N, &K);
int DP[N+1][K+1] = {0,};
for(int i=1; i<=N; i++) DP[i][1] = 1; // N = i, K = 1์ผ ๋ ๋ชจ๋ N์ ๋ํด์ ํญ์ 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-1][j] + DP[i][j-1]) % 1000000000;
//printf("DP[%d][%d]: %d\n", i, j, DP[i][j]);
}
}
printf("%d", DP[N][K]);
}