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