문제출처: 백준
문제 링크: https://www.acmicpc.net/problem/11051
난이도: ★★☆☆☆
- 문제 분류: 다이나믹 프로그래밍 (dp)
[문제]
[분석]
항상 풀던 dp문제이다.base case의 경우, 이항계수의 기본 성질을 base case로 하면 된다.또한, n>k가 되면 이항계수를 구할 수 없다.
다음의 경우가 BASE CASE가 된다.
Recursive case의 경우 다음 표를 보면 담번에 이해된다.
다음 같은 규칙이 성립되는 이유는 다음과 같다.
규칙을 이항계수 식으로 표현하면 다음과 같다.
이 공식을 조합 규칙에 따라 변환한 뒤, 풀어보았다.
다음 공식으로 테이블의 법칙은 증명가능하다.
이제 점화식을 구하면 다음과 같다.
- 점화식
[코드]
#include<iostream>
using namespace std;
unsigned long long dp[1001][1001];
int main(){
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++) {
dp[i][i]=1;
dp[i][0]=1;
}
if(n>=2){
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++) dp[i][j]=(dp[i-1][j-1]+dp[i-1][j])%10007;
}
}
cout<<dp[n][k]<<endl;
}
n>k의 경우 코드로 구현 시, 0으로 구현하면 결과에 아무런 영향을 미치지 않는다.
문제에서 이미 이 경우는 주지 않는다고 표기
'코딩테스트' 카테고리의 다른 글
[C++] (프로그래머스) 모의고사 (0) | 2022.03.03 |
---|---|
[C++] (백준 2193번) 이친수 (0) | 2022.01.17 |
[C++] (백준 1932 번) 정수 삼각형 (0) | 2022.01.13 |
[C++] (백준 11726 번) 2×n 타일링 (0) | 2022.01.12 |
[C++] (백준 9095번) 1, 2, 3 더하기 (0) | 2022.01.11 |