코딩테스트

[C++] (백준 11051 번) 이항 계수 2

뇨롱 2022. 1. 13. 17:48

 

문제출처: 백준
문제 링크: 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으로 구현하면 결과에 아무런 영향을 미치지 않는다.

문제에서 이미 이 경우는 주지 않는다고 표기