본문 바로가기

백준/DP

백준 11051 - 이항 계수 2

728x90
728x90

icpc.me/11051

 

11051번: 이항 계수 2

첫째 줄에 \(N\)과 \(K\)가 주어진다. (1 ≤ \(N\) ≤ 1,000, 0 ≤ \(K\) ≤ \(N\))

www.acmicpc.net

 

이항 계수 $\binom{N}{K}$를 구하는 문제이다.

 

$N \leq 1000$이므로 점화식 $bino(n, k) = bino(n - 1, k) + bino(n - 1, k - 1)$을 단순한 이용한 재귀를 통해서는 구할 수 없다.

 

메모이제이션을 통해 배열에 값을 저장하면 빠르게 계산을 할 수 있다.

 

전체 코드

더보기
#include <iostream>
#include <cstring>

using namespace std;

int bino[1001][1001] {};

int solve(int n, int r);

int main()
{
    memset(bino, -1, sizeof bino);
    bino[0][0] = bino[1][0] = bino[1][1] = bino[2][2] = 1;
    bino[2][1] = 2;
    
    int n, r; cin >> n >> r;
    cout << solve(n, r);
}

int solve(int n, int r)
{
    if (n < r || r < 0)
        return 0;
    if (bino[n][r] != -1)
        return bino[n][r];
    
    bino[n][r] = ( solve(n - 1, r) % 10007 + solve(n - 1, r - 1) % 10007 ) % 10007;
    
    return bino[n][r];
}

728x90
728x90

'백준 > DP' 카테고리의 다른 글

백준 1513 - 경로 찾기  (0) 2020.12.03
[ICPC] 백준 2159 - 케익 배달  (0) 2020.12.01
[ICPC] 백준 4811 - 알약  (0) 2020.11.30
백준 2248 - 이진수 찾기  (0) 2020.11.21
백준 1328 - 고층 빌딩  (0) 2020.11.15