solution
1. dp 이용
# 1010, 다리 놓기
import sys
t = int(sys.stdin.readline())
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 i in range(t):
n, m = map(int, sys.stdin.readline().split())
print(dp[n][m])
29380KB
64ms
dp에서 문제 고른 게 아니었으면 생각 못 했을 것 같다..
2. 조합 이용
# 1010, 다리 놓기
import sys
t = int(sys.stdin.readline())
for i in range(t):
n, m = map(int, sys.stdin.readline().split())
if n == m:
print(1)
else:
ans = 1
for i in range(m, m-n, -1):
ans *= i
for j in range(n, 1, -1):
ans = ans // j
print(ans)
29380KB
64ms
문제 출처 www.acmicpc.net/problem/1010
1010번: 다리 놓기
입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.
www.acmicpc.net
'알고리즘 > Dynamic Programming' 카테고리의 다른 글
자바 | 백준 | 2096 | 내려가기 (0) | 2021.03.21 |
---|