题解 | #串#
串
http://www.nowcoder.com/practice/01c35f01fb7343fe9fc16139562f78ed
描述
问有多少字符串满足以下条件:
- 长度不超过
- 包含子序列us 结果对取模
思路
- 典型的dp问题,设表示长度为且不包含字母u的字符串数目,表示长度为字母u的字符串数目,表示长度为且包含子序列us的数目,答案为
- 转移方程为
- 由于状态转移仅和前一个状态相关,可以采取边遍历边的方法省略一维度,具体实现见代码
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD=1e9+7;
int dp[3]; //0->空,1->包含u,2->包含us
int main()
{
int n;
int ans=0;
scanf("%d",&n);
dp[0]=1;
for(int i=1;i<=n;i++)
{
dp[2]=(1LL*dp[1]+26LL*dp[2])%MOD;
dp[1]=(1LL*dp[0]+25LL*dp[1])%MOD;
dp[0]=25LL*dp[0]%MOD;
ans=(1LL*ans+dp[2])%MOD;
}
printf("%lld\n",ans);
}
时间复杂度,空间复杂度