동적 계획법(Dynamic Programming)을 사용해서 문제를 해결해 보자.
길이가 n이고 마지막 숫자가 0에서 9까지 각각인 계단 수의 개수를 dp[n][last]라고 할 때,
- (dp[1][0] = 0) (길이가 1이고 마지막 숫자가 0인 계단 수는 없다.)
- (dp[1][i] = 1) (1<= i <= 9), 길이가 1이고 마지막 숫자가 (i)인 계단 수는 1개
- (dp[n][0] = dp[n-1][1])
- (dp[n][9] = dp[n-1][8])
- (dp[n][i] = dp[n-1][i-1] + dp[n-1][i+1]) ((1 <= i <= 8))
- (dp[n][0])에서 (dp[n][9])까지의 합하면(sum(dp[n]) 답이 된다
n = int(input())
dp = [[0] * 10 for _ in range(n+1)]
for i in range(1, 10):
dp[1][i] = 1
for i in range(2, n+1):
for j in range(10):
if j == 0:
dp[i][j] = dp[i-1][1]
elif j == 9:
dp[i][j] = dp[i-1][8]
else:
dp[i][j] = dp[i-1][j+1] + dp[i-1][j-1]
print(sum(dp[-1])%(10**9))
'Tech > Coding' 카테고리의 다른 글
🐨그리디 알고리즘 (3) | 2024.03.19 |
---|---|
C언어 기본] 01 프로그램 만들기 (0) | 2024.03.04 |
나의 방학 (0) | 2024.03.02 |
가장 가까운 두 점 (0) | 2024.03.02 |
가장 긴 바이토닉 부분 수열 (0) | 2024.03.02 |