题目:点击打开链接
题意:国王说话结巴,但结巴的末尾字母长度不会超过3次为合法,求合法单词个数,看hint递推一下即可
解法:dp[i][j]:i长度 j个末尾长度相等,j只能取1,2,3,纸上写写dp的前几个推推就出来了。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int t,n;
long long dp[2002][4];
cin>>t;
while(t--)
{
cin>>n;
memset(dp,0,sizeof(dp));
dp[1][1]=26; //dp[i][j]代表 i长度 j个末尾长度相等的
for(int i=2;i<=n;i++)
{
dp[i][1]=(dp[i-1][1]+dp[i-1][2]+dp[i-1][3])%1000000007*25;
dp[i][2]=dp[i-1][1]%1000000007;
dp[i][3]=dp[i-1][2]%1000000007;
}
cout<<(dp[n][1]+dp[n][2]+dp[n][3])%1000000007<<endl;
}
return 0;
}