[伯俊/Python 3]10844簡単な階段数
https://www.acmicpc.net/problem/10844
これは,長さN,隣接数の差がいずれも1である全数の個数を求める問題である.このとき90,09は階段数ではありません.
これはダイナミックプログラミングの問題です.2 D dptableで解決できます.
に答える
これは,長さN,隣接数の差がいずれも1である全数の個数を求める問題である.このとき90,09は階段数ではありません.
これはダイナミックプログラミングの問題です.2 D dptableで解決できます.
dp[i]
は、N長の段差数の個数である.このときdp[i][j]は以下のようになる.dp[i][j] => i의 길이를 가지며 숫자 j로 끝나는 계단 수의 개수
端数が1差であることからステップ数と呼ぶことができるので、nの長さを有し、端数jのステップ数の数字は以下のように表すことができる.dp[n][j] = dp[n-1][j-1] + dp[n-1][j+1]
ただし、端数が0または9の場合、互いに隣接していても段差数ではないので、この場合は単独で排除すべきである.最終的には、次のように表現できます.if j==0:
dp[n][j] = dp[n-1][j+1]
elif j==9:
dp[n][j] = dp[n-1][j-1]
else:
dp[n][j] = dp[n-1][j-1] + dp[n-1][j+1]
10,000,000,000に分割しないと、数値が大きすぎてメモリが過剰になる可能性があるので、毎回処理します.コード#コード#
# Initial
N = int(input())
dp = [[0 for _ in range(10)] for _ in range(N+1)]
answer = 0
mod = 1000000000
# Make DP table
for i in range(1, 10):
dp[1][i] = 1
if N > 1:
for i in range(2, N+1):
for j in range(0, 10):
if j == 0:
dp[i][j] = dp[i-1][j+1] % mod
elif j == 9:
dp[i][j] = dp[i-1][j-1] % mod
else:
dp[i][j] = (dp[i-1][j-1] + dp[i-1][j+1]) % mod
# Answer
for i in range(10):
answer = (answer + dp[N][i]) % mod
print(answer)
Reference
この問題について([伯俊/Python 3]10844簡単な階段数), 我々は、より多くの情報をここで見つけました https://velog.io/@nyamnyam/백준Python3-10844-쉬운-계단-수テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol