终于淦死了这题...
还是有点烦的,最后没想到直接爆力DFS记忆化搜索就完事了...
主要是搜索的状态设置,因为它说交换相邻两个字母后不能出现 \(AGC\) ,所以考虑的字符串长度应该为四,因此直接设置最后四个字母保留在搜索中。
const int N=105,mod=1e9+7;
ll n,f[N][5][5][5][5];//0A,1G,2C,3T
inline ll dfs(int pos,int a,int b,int c,int d){
if(f[pos][a][b][c][d]!=-1) return f[pos][a][b][c][d];
if(a==0&&b==1&&c==2) return 0;
if(a==0&&b==2&&c==1) return 0;
if(a==1&&b==0&&c==2) return 0;
if(a==0&&b==1&&d==2) return 0;
if(b==0&&c==1&&d==2) return 0;
if(b==0&&c==2&&d==1) return 0;
if(b==1&&c==0&&d==2) return 0;
if(a==0&&c==1&&d==2) return 0;
if(pos==n+1) return 1;
ll ans=0;
for(int i=0;i<=3;++i)
(ans+=dfs(pos+1,b,c,d,i))%=mod;
return f[pos][a][b][c][d]=ans;
}
signed main(){
IOS
cin>>n;
memset(f,-1,sizeof(f));
cout<<dfs(1,4,4,4,4)<<'\n';
return 0;
}
· EOF
标签:return,int,ll,AGC,pos,ABC122D,P11,&& From: https://www.cnblogs.com/mfc007/p/18673876