중복순열 문제이며 N개를 K칸에 분배하는 문제이다.
K칸에서 N-1개를 분배하는 경우에서 1개를 더 분배하는 모든 경우의 수(0인칸이 남는 경우의수가 배제됨)
N개를 K-1칸에 분배 하는 경우의 수에 0인칸을 하나씩 붙혀주는 경우의 수(위에서 배제된 경우의 수가 충족됨)
의 합을 구하는 문제.
import sys
input = sys.stdin.readline
N, K = map(int, input().split())
dp = [[0]*5001 for _ in range(5001)]
# 결국 숫자1 N개를 K개의 칸에 분배하는 경우의 수.
# N-1개를 K개에 분배하는 경우의수에 1씩 더하는 경우 + N개를 K-1개에 분배하는 경우의수에서 0을 가지는 한칸을 더하는경우,
for i in range(1,N+1):
for j in range(1,K+1):
if i==1:
dp[i][j] = j
else:
dp[i][j] = (dp[i-1][j] + dp[i][j-1])%1000000000
print(dp[N][K])
'practivceAlgorithm > 백준' 카테고리의 다른 글
[백준][Python] 16163 #15164번 제보 (0) | 2021.08.18 |
---|---|
[백준][Pyhton] 13275 14444 가장 긴 펠린드롬 부분 문자열 (0) | 2021.08.18 |
[백준][Python] 20207 달력 (0) | 2021.08.16 |
[백준][Python] 1913 달팽이 (0) | 2021.08.16 |
[백준][Python] 16139 컴퓨터 인간 상호작용 (0) | 2021.08.16 |