题解:AT_abc122_d [ABC122D] We Like AGC
你说得对,但是我不喜欢 AGC。
思路
先考虑什么样的字符串是不能出现的。
不难发现,违反限制
AGC
。
违反限制
ACG
(交换C
和G
);GAC
(交换G
和A
);AG?C
(交换?
和C
,其中?
是A
、C
、G
、T
中任一个);A?GC
(交换A
和?
)。
然后就可以 dp 了。
我们用 A
,G
,C
,T
。
设
那么我们枚举第
于是做完了。
代码
#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
int n,dp[105][4][4][4];
int ans;
int main(){
scanf("%d",&n);
if(n==1){
printf("4");
return 0;
}
if(n==2){
printf("16");
return 0;
}
if(n==3){
printf("61");
return 0;
}
//A0 G1 C2 T3
dp[0][3][3][3]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<4;j++){
for(int k=0;k<4;k++){
for(int l=0;l<4;l++){
for(int p=0;p<4;p++){
if(k==0&&l==1&&p==2)continue;//AGC
if(k==0&&l==2&&p==1)continue;//ACG
if(k==1&&l==0&&p==2)continue;//GAC
if(j==0&&k==1&&p==2)continue;//AG-C
if(j==0&&l==1&&p==2)continue;//A-GC
dp[i][k][l][p]=(dp[i-1][j][k][l]+dp[i][k][l][p])%mod;
}
}
}
}
}
for(int i=0;i<4;i++){
for(int j=0;j<=3;j++){
for(int k=0;k<=3;k++){
ans=(ans+dp[n][i][j][k])%mod;
}
}
}
printf("%d\n",ans);
return 0;
}
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】