https://www.acmicpc.net/problem/11050
이항 계수를 파스칼 삼각형으로 나타냈을 때,
bc[i][j] = bc[i-1][j-1] + bc[i-1][j] 임을 이용하여
DP bottom-up 방식으로 풀었다.
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int N, K;
cin >> N >> K;
vector<vector<int>> bc(N+1, vector<int>(N+1, 1));
for(int i=2; i<=N; i++) {
for(int j=1; j<i; j++) {
bc[i][j] = bc[i-1][j-1] + bc[i-1][j];
}
}
cout << bc[N][K];
return 0;
}
풀이 1과 유사하지만, DP top-down 방식으로 풀었다.
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> bc(11, vector<int>(11));
int dp(int i, int j) {
if(j == 0 || i == j) return 1;
if(bc[i][j]) return bc[i][j];
return bc[i][j] = dp(i-1, j) + dp(i-1, j-1);
}
int main()
{
int N, K;
cin >> N >> K;
cout << dp(N, K);
return 0;
}
이항 계수는 nCk = n! / (k!(n-k)!) 이므로
이 계산식을 그대로 구현하였다.
#include <iostream>
using namespace std;
int factorial(int num) {
int mul = 1;
for(int i=1; i<=num; i++) mul *= i;
return mul;
}
int main()
{
int N, K;
cin >> N >> K;
if(K == 0 || N == K) cout << 1;
else cout << factorial(N) / (factorial(K) * factorial(N-K));
return 0;
}
풀이 1은 1~N 인 n에 대하여 모든 이항 계수를 구해야 하지만,
풀이 2는 필요한 이항 계수만 구한다.
이 문제의 N과 K가 작아서 수행 시간의 차이가 보이지 않지만,
수가 커지면 top-down 방식을 이용하는 것이 좋을 것 같다.


