LoginSignup
0
0

More than 1 year has passed since last update.

典型90問008 AtCounterで解く!

Posted at

はじめに

AtCoder現在茶色(年内には緑が目標!)のあんこちゃん(@Chunky_RBP_chan)です。
典型問題は抑えとかねばということで、★2〜★5に取り組んでいます。
Pythonで取り組まれている方も多いと思うので自分の解答をシェアしたいと思います!

問題

解法

AtCounter.png
DP[i][j]:Sのj-1文字目までにatcoderの1からi-1文字までが含まれる個数となるDPを考えます。

更新式は
atcoder[i]=S[j]の時
DP[i+1][j+1] += DP[i][j]
DP[i][j+1] += DP[i][j]
atcoder[i] != S[j]の時
DP[i][j+1] += DP[i][j]

例えば、DP[0][0]からDP[1][1]への遷移は
attcorderの1文字目のaをatcoderのaに選ぶことと同じ意味です。
一方でDP[0][0]からDP[0][1]への遷移は
attcoderの1文字目のaを選ばずにattcoderの2文字目への移動を意味します。
他にもDP[1][1]からDP[2][2]への遷移は
attcoderの二文字目のtをatcoderのtに選ぶことと同じです。
したがって、DP[8]にSに含まれるatcoderの個数が並ぶためDP[8]の合計値が答えとなります。

N = int(input())
S = input()
atcoder = 'atcoder'
MOD = 10**9+7
dp = [[0]*8 for _ in range(N+1)]
dp[0][0] = 1
for i in range(N):
    s = S[i]
    for j in range(7):
        if s == atcoder[j]:
            dp[i+1][j+1] += dp[i][j]%MOD
        dp[i+1][j] += dp[i][j]%MOD
    dp[i+1][-1] += dp[i][-1]%MOD
print(dp[-1][-1]%MOD)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0