其他分享
首页 > 其他分享> > 11.22刷题

11.22刷题

作者:互联网

NC20 串

问有多少字符串满足以下条件:

长度不超过nnn
包含子序列us 结果对1e9+7取模

思路:

设dp[n][0]为长度为n且不包括字母u的字符串数目,dp[n][1]表示长度为n只包括u的字符串数目,dp[n][2]表示包括长度为n包含us的字符串数目,则答案为 ∑ i < = n d p [ i ] [ 2 ] \sum_{i<=n}{dp[i][2]} i<=n∑​dp[i][2].
可得:
{ d p [ n ] [ 2 ] = d p [ n − 1 ] [ 1 ] + d p [ n − 1 ] [ 2 ] ∗ 26 d p [ n ] [ 1 ] = d p [ n − 1 ] [ 0 ] + d p [ n − 1 ] [ 1 ] ∗ 25 d p [ n ] [ 0 ] = d p [ n − 1 ] [ 0 ] ∗ 25 \left\{ \begin{aligned} dp[n][2] = & dp[n-1][1]+dp[n-1][2]*26 \\ dp[n][1] = & dp[n-1][0]+dp[n-1][1]*25 \\ dp[n][0] = & dp[n-1][0]*25 \\ \end{aligned} \right. ⎩⎪⎨⎪⎧​dp[n][2]=dp[n][1]=dp[n][0]=​dp[n−1][1]+dp[n−1][2]∗26dp[n−1][0]+dp[n−1][1]∗25dp[n−1][0]∗25​
由于状态n只与上一个状态相关,因此可以将空间复杂度优化为: O ( n ) O(n) O(n)
实现代码:

n = int(input())
dp = [0]*(3)
dp[0]=1
ans = 0
mod = 10**9+7
for i in range(1,n+1):
    dp[2] = (dp[1] + dp[2]*26)%(mod)
    dp[1] =(dp[0]+dp[1]*25)%(mod)
    dp[0] = (dp[0]*25)%(mod)
    ans = (ans+dp[2])%(mod)
print(ans)

标签:25,26,11.22,ans,字符串,刷题,dp,mod
来源: https://blog.csdn.net/weixin_44431508/article/details/121464841