这个题可以说是记忆化搜索,和数位dp也有点相似。刚好做了一道数位dp,然后水了水这个。
#include <bits/stdc++.h> using namespace std; char s[55]; int dp[4][55][55][55][4]; int mod=1e9+7; int a[5]; int dfs(int now,int a,int b,int c,int first) { if(a+b+c==1) { int flag=0; if(a==1&&first!=1&&now!=1)flag=1; if(b==1&&first!=2&&now!=2)flag=1; if(c==1&&first!=3&&now!=3)flag=1; return flag; } if(dp[now][a][b][c][first]!=-1) return dp[now][a][b][c][first]; int ans=0; if(now==0) { if(a>0) ans+=dfs(1,a-1,b,c,1); ans%=mod; if(b>0) ans+=dfs(2,a,b-1,c,2); ans%=mod; if(c>0) ans+=dfs(3,a,b,c-1,3); ans%=mod; } if(now==1) { if(b>0) ans+=dfs(2,a,b-1,c,first); ans%=mod; if(c>0) ans+=dfs(3,a,b,c-1,first); ans%=mod; } if(now==2) { if(a>0) ans+=dfs(1,a-1,b,c,first); ans%=mod; if(c>0) ans+=dfs(3,a,b,c-1,first); ans%=mod; } if(now==3) { if(a>0) ans+=dfs(1,a-1,b,c,first); ans%=mod; if(b>0) ans+=dfs(2,a,b-1,c,first); ans%=mod; } dp[now][a][b][c][first]=ans; return ans; } int main() { int t; scanf("%d",&t); memset(dp,-1,sizeof(dp)); while(t--) { int tmp; a[0]=a[1]=a[2]=0; scanf("%s",s); int len=strlen(s); for(int i=0;i<len;i++) { tmp=(int)(s[i]-'A'); a[tmp]++; } printf("%d\n",dfs(0,a[0],a[1],a[2],0)); } return 0; } /* */