//用三种颜色围成一个圈相邻的两个不同色的所有可能
#include<stdio.h>
#include<string.h>
#include<string>
using namespace std;
typedef int lld;
const int mod=1000000007;
const int maxn=60;
lld dp[maxn][maxn][maxn][3];
int tot[maxn];
class ColorfulCupcakesDivTwo
{
public:
int Gao(int x,int y,int z,int sum)
{
int i,j,k,t1,t2;
memset(dp,0,sizeof(dp));
dp[0][0][0][0]=1;
for(i=1;i<=sum;i++)
{
for(j=0;j<=i && j<=y;j++)
for(k=0;k<=i && k<=z;k++)
for(t1=0;t1<3;t1++)
{
if(t1==0)
{
dp[i][j][k][0]=(dp[i][j][k][0]+dp[i-1][j][k][1])%mod;
dp[i][j][k][0]=(dp[i][j][k][0]+dp[i-1][j][k][2])%mod;
}
else if(t1==1)
{
dp[i][j][k][1]=(dp[i][j][k][1]+dp[i-1][j-1][k][0])%mod;
dp[i][j][k][1]=(dp[i][j][k][1]+dp[i-1][j-1][k][2])%mod;
}
else
{
dp[i][j][k][2]=(dp[i][j][k][2]+dp[i-1][j][k-1][1])%mod;
dp[i][j][k][2]=(dp[i][j][k][2]+dp[i-1][j][k-1][0])%mod;
}
}
}
return (dp[sum][y][z][1]+dp[sum][y][z][2])%mod;
}
int countArrangements(string cupcakes)
{
int i,j,k;
int sz=cupcakes.size();
memset(tot,0,sizeof(tot));
for(i=0;i<sz;i++)
{
if(cupcakes[i]=='A') tot[0]++;
else if(cupcakes[i]=='B') tot[1]++;
else tot[2]++;
}
int ans=0;
int sum=tot[0]+tot[1]+tot[2]-1;
ans=Gao(tot[0]-1,tot[1],tot[2],sum);
ans=(ans+Gao(tot[1]-1,tot[0],tot[2],sum))%mod;
ans=(ans+Gao(tot[2]-1,tot[0],tot[1],sum))%mod;
return ans;
}
};
SRM 551 950
最新推荐文章于 2020-12-29 20:38:21 发布