[BOJ] 11050 이항 계수
수학, 다이나믹 프로그래밍
이항 계수란 (x+y)^N을 전개했을 때 나오는 식의 계수를 의미한다. 1, 11, 121, 1331, 14641 등의 피라미드 구조를 쌓으며 진행된다. 이는 nCk의 조합으로 나타낼 수 있다. 이는 트리구조를 나타내며 간단하게 n-1Ck-1 + n-1Ck 로 구할 수 있다. 따라서 다이나믹 프로그래밍을 이용하여 구할 수 있다. N이 커질수록 재귀가 깊어지므로 DP테이블을 이용하여 시간복잡도를 개선한다.
코드는 아래와 같다.
import sys
# def binomial_coefficient(n, k):
# if k == 0 or k == n:
# return 1
# return binomial_coefficient(n-1, k-1) + binomial_coefficient(n-1, k)
def binomial_coefficient(n, k):
if k == 0 or k == n:
memoization[n][k] = 1
return memoization[n][k]
if memoization[n-1][k-1] == 0:
memoization[n-1][k-1] = binomial_coefficient(n-1, k-1)
if memoization[n-1][k] == 0:
memoization[n-1][k] = binomial_coefficient(n-1, k)
return memoization[n-1][k-1] + memoization[n-1][k]
if __name__ == "__main__":
sys.setrecursionlimit(100000)
N, K = map(int, sys.stdin.readline().rstrip().split())
memoization = [[0]*(K+1) for _ in range(N+1)]
print(binomial_coefficient(N, K))