https://www.acmicpc.net/problem/9471
시간 1초, 메모리 128MB
input :
output :
조건 :
n -> n - 1 / n + 1
그러면 이것을 어떻게 리스트로 나타낼 것인가?
그냥 숫자를 곱하거나 더해서 만드는 건 불가능 할 것 같고.
숫자의 맨 뒷자리를 리스트 인덱스로 분류해서 계산하자.
어차피 숫자의 최대 길이는 100이니까 최대로 리스트를 만들어도 1000 밖에 되지 않는다.
바텀업 방식으로 모든 경우를 다 만든 다음에 마지막에 출력할 때 전체 행을 게산하도록 하자.
import sys
T = int(sys.stdin.readline())
dp = [[0] * 10 for _ in range(101)]
for i in range(10):
dp[1][i] = 1
for x in range(2, 101):
for y in range(10):
up = y + 1
down = y - 1
if down >= 0:
dp[x][down] += dp[x - 1][y]
if up < 10:
dp[x][up] += dp[x - 1][y]
res = 0
for i in range(10):
res += dp[T][i]
print((res - dp[T][0]) % 1000000000)
경우만 신경 쓰지 말고. DP를 어떻게 구성할 지도 생각하면서 문제를 보자.