2014年山东省第五届ACM大学生程序设计竞赛Colorful Cupcakes

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

*/


猜你喜欢

转载自blog.csdn.net/clx55555/article/details/80030701