P11 ABC122D We Like AGC

​ 终于淦死了这题...

​ 还是有点烦的,最后没想到直接爆力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

posted @ 2025-01-15 22:57  ComplexityMFC  阅读(15)  评论(0)    收藏  举报