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

이항 계수 2

https://www.acmicpc.net/problem/11051

시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초256 MB49473183531443437.625%

예제 입력 1

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
5 2
5 2
5 2

예제 출력 1

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
10
10
10

출처

알고리즘 분류


전에 풀었던 11050번의 응용 문제

조합에 대한 기본 개념을 가지고 점화식으로 접근해야 해결이 가능하다.


통과된 코드

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#include <iostream>
using namespace std;
constexpr int MAX = 1001;
constexpr int MOD = 10007;
// arr[i][j]
// i 총 숫자의 개수
// j 선책 수 개수
// i 개중 j개를 뽑았을때 조합 경우 수
int DP[MAX][MAX];
// DP 배열을 초기화 해주는 함수
void DP_Initialiaztion()
{
for (int i = 1; i < MAX; i++) {
DP[i][1] = i; // i개 중 1개를 뽑는 경우의 수는 i개
DP[i][0] = 1; // i개 중 1개도 선택하지 않는 경우의 수는 1개
DP[i][i] = 1; // i개 중 i개를 선택하는 경우의 수는 1개
}
}
int main()
{
int N, K;
cin >> N >> K;
// 배열 초기화
DP_Initialiaztion();
for (int i = 2; i <= N; i++) {
for (int j = 1; j < i; j++) {
DP[i][j] = (DP[i - 1][j] + DP[i - 1][j - 1]) % MOD;
}
}
cout << DP[N][K]; // 결과 출력하기
return 0;
}
#include <iostream> using namespace std; constexpr int MAX = 1001; constexpr int MOD = 10007; // arr[i][j] // i 총 숫자의 개수 // j 선책 수 개수 // i 개중 j개를 뽑았을때 조합 경우 수 int DP[MAX][MAX]; // DP 배열을 초기화 해주는 함수 void DP_Initialiaztion() { for (int i = 1; i < MAX; i++) { DP[i][1] = i; // i개 중 1개를 뽑는 경우의 수는 i개 DP[i][0] = 1; // i개 중 1개도 선택하지 않는 경우의 수는 1개 DP[i][i] = 1; // i개 중 i개를 선택하는 경우의 수는 1개 } } int main() { int N, K; cin >> N >> K; // 배열 초기화 DP_Initialiaztion(); for (int i = 2; i <= N; i++) { for (int j = 1; j < i; j++) { DP[i][j] = (DP[i - 1][j] + DP[i - 1][j - 1]) % MOD; } } cout << DP[N][K]; // 결과 출력하기 return 0; }
#include <iostream>

using namespace std;

constexpr int MAX = 1001;
constexpr int MOD = 10007;

// arr[i][j] 
// i 총 숫자의 개수
// j 선책 수 개수
// i 개중 j개를 뽑았을때 조합 경우 수
int DP[MAX][MAX];

// DP 배열을 초기화 해주는 함수
void DP_Initialiaztion()
{
	for (int i = 1; i < MAX; i++) {
		DP[i][1] = i; // i개 중 1개를 뽑는 경우의 수는 i개
		DP[i][0] = 1; // i개 중 1개도 선택하지 않는 경우의 수는 1개
		DP[i][i] = 1; // i개 중 i개를 선택하는 경우의 수는 1개
	}
}

int main()
{
	int N, K;
	cin >> N >> K;

	// 배열 초기화
	DP_Initialiaztion();

	for (int i = 2; i <= N; i++) {
		for (int j = 1; j < i; j++) {
			DP[i][j] = (DP[i - 1][j] + DP[i - 1][j - 1]) % MOD;
		}
	}

	cout << DP[N][K]; // 결과 출력하기

	return 0;
}

팩토리얼 계산과 모듈러 연산 개념으로 접근했지만 실패

점화식을 이용한 접근으로 해결하였다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다