BOJ 11057上り坂数


https://www.acmicpc.net/problem/11057
1秒、256 MBメモリ
input :
  • N (1 <= N <= 1,000)
  • output :
    出力
  • 長さNの上り坂数を10007の残数で割った.
  • 条件:
  • 上り坂数=数字の位置を昇順に並べた数.
  • 隣接数が同じでも昇順に並べます.
  • の数はゼロから始まることができます.
  • 10844題とあまり違わない
    今回はゼロを含めることができ、減算する必要はありません.

    ポイント。


    数字の末尾が0の場合、次の数字は10種類あります.
    反復文ですべてのdpに入るとき+1をする
    数字の末尾が1なら次の9種類...
    2の場合は8種類あります.
    ...
    9の場合は1種類あります.
    繰り返しで埋め尽くせばいい
    import sys
    
    T = int(sys.stdin.readline())
    dp = [[0] * 10 for _ in range(1001)]
    
    for i in range(10):
        dp[1][i] = 1
    
    for x in range(1, 1000):
        for y in range(10):
            for k in range(y, 10):
                dp[x + 1][k] += 1 * dp[x][y]
    
    res = 0
    for i in range(10):
        res += dp[T][i]
    
    print(res % 10007)
    一行を探して入る.カラムの値を読み込む
    カラムの値を繰り返す必要があるため、3回ループする必要があります.
    結果は1000行目まで生成されるので、999行目まで繰り返してください.