这个题可以说是记忆化搜索,和数位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;
}
/*
*/