이 문제를 해결하는 데는 두 가지 방법이 존재함.
두 문제에 공통적으로 사용되는 요소는 조합.
조합 = 서로 다른 n개 중에 r개를 선택하는 경우의 수 의미.
${}_nC_r = {n! \over (n-r)!r!}$
1. 다이나믹 프로그래밍 적용 X
def factorial(N):
if N > 1:
return (N * factorial(N-1))
else:
return 1
T = int(input())
for _ in range(T):
N, M = list(map(int, input().split()))
print (factorial(M) // (factorial(M-N) * factorial(N)))
2. 다이나믹 프로그래밍 적용 O
T = int(input())
dp = [[0] * 30 for _ in range(30)]
for i in range(30):
for j in range(30):
if i == 1:
dp[i][j] = j
else:
if i == j:
dp[i][j] = 1
elif i < j:
dp[i][j] = dp[i-1][j-1] + dp[i][j-1]
for _ in range(T):
N, M = list(map(int, input().split()))
print (dp[N][M])
'Computer Science > 백준 알고리즘' 카테고리의 다른 글
[백준] 1001번 A-B (C++) (0) | 2022.03.11 |
---|---|
[백준] 1000번 A+B (C++/파이썬) (0) | 2022.03.11 |
[백준 알고리즘] 1913번 달팽이 (C++) (0) | 2021.11.09 |
[백준 알고리즘] 2908번 상수 (C++) (0) | 2021.11.01 |
[알고리즘] N 계단 오르기 (0) | 2021.10.20 |