题目链接
题意:用26个字母组合出一个长度是n的序列,且不能出现连续3个相同的字符。问一共有多少情况。
解法:dp[i][j][k]:表示组合长度是i的时候,在这i位置放入字母j,字母j连续出现的长度是k,转移,就是看i-1位置填入的
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <set>
#include <vector>
#include <map>
using namespace std;
const int maxn=2100;
const int inf=1<<28;
#define LL long long
#define cl(a,b) memset(a,b,sizeof(a))
const LL mod=1000000007;
LL dp[maxn][26][4];
void work(){
for(int i=0;i<26;i++)dp[1][i][1]=1;//初始化
for(int i=2;i<=2000;i++){
for(int j=0;j<26;j++){
for(int k=1;k<=3;k++){
for(int x=0;x<26;x++){
if(x==j){
if(k-1==3)continue;
dp[i][j][k]=(dp[i][j][k]+dp[i-1][x][k-1])%mod;
}
else {
dp[i][j][1]=(dp[i][j][1]+dp[i-1][x][k])%mod;
}
}
}
}
}
}
int main(){
int T;
scanf("%d",&T);
work();
while(T--){
int n;scanf("%d",&n);
LL ans=0;
for(int i=0;i<26;i++){
for(int j=1;j<=3;j++){
ans=(ans+dp[n][i][j])%mod;
}
}
printf("%lld\n",ans);
}
return 0;
}