728x90
반응형
https://www.acmicpc.net/problem/16565
문제 해결
- DP를 이용해 n개중 m개를 뽑았는데 그중 k개 종류가 나올 경우의 수를 dp[m][k]라고 정의한다.
- dp[0][0]은 1로 정의
- 그러면 $ dp[i][j] = \sum_{k=0}^{3} \binom{4}{k} \times dp[i-k][j-1]$
- 이후 포카드가 나올 수 있는 경우의 수를 계산하기 위해
- idx (포카드 나오는 개수)
- $ ans += \binom{13}{idx} * dp[n-4*idx][13-idx]$
CODE
import sys
input = sys.stdin.readline
import math
mod = 10007
def combination(n, r):
return math.factorial(n)//(math.factorial(r)*math.factorial(n-r))
if __name__ == "__main__":
n = int(input())
dp = [[0 for _ in range(14)] for _ in range(n+1)]
dp[0][0] = 1
for i in range(n):
for j in range(13):
for k in range(4):
if i + k <=n:
dp[i+k][j+1] += dp[i][j]*combination(4,k)
idx = 1
ans = 0
while 4*idx <= n:
temp = combination(13, idx)
ans += temp*dp[n-4*idx][13-idx]
ans %= mod
idx += 1
print(ans%mod)
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 11438 LCA 2 (0) | 2024.06.06 |
---|---|
[python] 백준 4811 알약 (0) | 2024.06.02 |
[python] 20188 등산 마니아 (0) | 2024.05.22 |
[python] 백준 2150 Strongly Connected Component (0) | 2024.05.09 |
[python] 백준 2635 수 이어가기 (0) | 2024.04.18 |
댓글