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<=ndp[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[n1][1]+dp[n1][2]26dp[n1][0]+dp[n1][1]25dp[n1][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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值