반응형
문제
풀이
nCr = n * (n -1) * (n-2) * ... * (n-r+1) / r! 이지만
n과 r이 커지면 오버플로우가 발생합니다.
따라서 파스칼의 법칙을 사용하여 dp로 해결합니다.
위 그림을 보면 nCr에서 r이 0이거나, n = r일 때는 1, 나머지 경우에는 nCr = n-1Cr-1 + n-1Cr 입니다.
1C0과 1C1의 초기값을 설정해주고 dp를 이용해 nCk을 구합니다.
소스 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include <iostream>
#define num 10007
using namespace std;
int dp[1001][1001];
int n, k;
int main() {
cin >> n >> k;
dp[1][0] = 1;
dp[1][1] = 1;
for (int i = 2; i <= n; i++) {
for (int j = 0; j <= k; j++) {
if (j == 0 || i == j) {
dp[i][j] = 1;
}
else {
// 파스칼의 삼각형
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
dp[i][j] %= num;
}
}
}
cout << dp[n][k];
return 0;
}
|
cs |
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 2470] 두 용액 C++ (0) | 2021.09.25 |
---|---|
[백준 15686] 치킨 배달 C++ (0) | 2021.09.18 |
[백준 5014] 스타트링크 C++ (0) | 2021.09.16 |
[백준 11048] 이동하기 C++ (0) | 2021.09.14 |
[백준 1915] 가장 큰 정사각형 C++ (0) | 2021.09.13 |