๐ฃ ๋ฌธ์ ์ดํด
์์ฐ์ N๊ณผ ์ ์ K๊ฐ ์ฃผ์ด์ก์ ๋ ์ดํญ ๊ณ์ (N K)๋ฅผ 10,007๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
๋์ ๊ณํ๋ฒ(Dynamic Programming) ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
๐ญ ํ์ด ๊ณผ์
nCr = n-1Cr + n-1Cr-1 ์ ์ด ์ฑ๋ฆฝํ๊ฒ ๋๋ค.
์ฌํ 4๊ฐ ์ค์ 2๊ฐ๋ฅผ ์ ํํ ๋ (4C2) , ์ด๋ค ํ ์ฌํ์ ์ ์ธํ 3๊ฐ ์ค์ 2๊ฐ๋ฅผ ๋ฝ๋ ๊ฒฝ์ฐ (3C2) ์ ๊ทธ ํ ์ฌํ์ ๋ฌด์กฐ๊ฑด ๋ฝ๊ณ ๋จ์ 3๊ฐ ์ค์ 1๊ฐ๋ฅผ ๋ ๋ฝ๋ ๊ฒฝ์ฐ (3C1) ๋ฅผ ํฉํ ๊ฒ๊ณผ ๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ธ ๊ฒ์ด ํ์ค์นผ์ ์ผ๊ฐํ์ด๋ค.
์ ํ์์ dp[i][j] = dp[i-1][j] + dp[i-1][j-1] ์ด๋ค.
์์ฑ ์ธ์ด: C++
#include <cstdio>
int dp[1001][1001] = {1, };
const int REMAIN = 10007;
int pascal(int mVal, int kVal){
for (int i = 1; i <= mVal; ++i) {
dp[i][0] = dp[i][i] = 1;
for (int j = 1; j < i; ++j) {
// (a+b)%mod = (a%mod + b%mod)%mod ์ฑ์ง์ ์ด์ฉํ ๊ณ์ฐ
dp[i][j] = (dp[i-1][j] % REMAIN + dp[i-1][j-1] % REMAIN) % REMAIN;
}
}
return dp[mVal][kVal];
}
int main(){
int M, K;
scanf("%d %d", &M, &K);
printf("%d\n", pascal(M, K));
return 0;
}
๐ ๋ฐฐ์ด ์
DP๋ก ํธ๋ ํผ๋ณด๋์น ์์ด๊ฐ์ ๋๋์ด ๋ง์ด ๋ค์๋ค.
์ด ์ด์ ์ ์ฌ๊ทํจ์๋ก ์ง ์ฝ๋(๋ฉ๋ชจ์ด์ ์ด์ ์์ด)๋ ์์๋๋ฐ O(2N) ๋ต๊ฒ ์ ๋ ฅ ๊ฐ์ด ์กฐ๊ธ๋ง ์ปค์ง๋ฉด ์์ฒญ๋ ์๊ฐ์ด ๊ฑธ๋ ธ๋ค.
DP ๋ฐฐ์ด์ ์ฑ์์ ํ๋ค๋ณด๋ O(N2) ์ด๋ฉด ํ๋ฆฌ๊ฒ ๋์๋ค.
( + ๋ช ๋ฒ ํฌ์คํ ํ๋ฉด์ ๋๊ปด์ง๋ ๊ฒ์ด, ํผ ๊ฒ์ ์ ๋ฆฌํ๋ฉด์ ํ์ต๋ ๊ฒ์ ๋ ํ ๋ฒ ์๊ฐํ๊ณ ๋ชจ๋ฅด๋ ๊ฒ์ ๋ ์ฐพ์๋ณด๋ฉด์ ์ข ๋ ๊ฐ๊น๊ฒ ๋ด ๊ฒ์ด ๋๋ค๋ ๋๋์ด ๋ ๋ค. )