转载请注明出处,谢谢 http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove
终于在TC过了两题,可惜第三题看错了题目。
250pt:只需要判断有几种颜色即可。
class ColorfulBricks{
public:
int countLayouts(string bricks){
bool flag[26];
int cnt=0;
memset(flag,false,sizeof(flag));
for(int i=0;i<bricks.size();i++)
if(!flag[bricks[i]-'A']){
flag[bricks[i]-'A']=true;
cnt++;
}
if(cnt==1)
return 1;
if(cnt==2)
return 2;
return 0;
}
};
500pt:枚举颜色,以及中心位置,然后往两边依次找目标颜色,先找最近的交换
class ColorfulChocolates{
public:
int maximumSpread(string chocolates, int maxSwaps){
int mmax=1;
int len=chocolates.size();
for(int i=0;i<26;i++){
for(int j=0;j<len-1;j++){
int a=j,b=j+1;
int tmp=0;
int step=maxSwaps;
bool flag[60];
memset(flag,true,sizeof(flag));
for(int x=a,y=b;x>=0||y<len;x--,y++){
if(x>=0&&x<len&&chocolates[x]==i+'A'){
if(step>=a-x){
tmp++;
step-=a-x;
a--;
}
}
if(y>=0&&y<len&&chocolates[y]==i+'A'){
if(step>=y-b){
tmp++;
step-=(y-b);
b++;
}
}
}
mmax=max(mmax,tmp);
}
}
return mmax;
}
};
1000pt:比赛的时候看成了26种颜色,以及是要用到多重集和矩阵的Polya计数,傻X了。只有3种颜色,DP可破。写了两个版本,第一个在本机测的没有问题,提交通不过,应该是内存大了。
注释部分:dp[pos][a][b][c][kind] ,表示前pos个位置,用了a个A,b个B,c个C。最后一位是kind的种数。枚举起点。
第二种:dp[fst][pre][a][b][c]表示第一个是fst,当前最后一个是pre,用了a个A,b个B,c个C的种数。记忆化搜索可破。
int dp[3][3][51][51][51];
int cnt[3],n;
class ColorfulCupcakesDivTwo{
public:
int slove(int pos,int pre,int fst,int a,int b,int c){
if(a<0||b<0||c<0)
return 0;
if(pos==n)
return pre!=fst;
if(dp[fst][pre][a][b][c]!=-1)
return dp[fst][pre][a][b][c];
int ret=0;
if(pos==0){
ret=(ret+slove(pos+1,0,0,a-1,b,c))%MOD;
ret=(ret+slove(pos+1,1,1,a,b-1,c))%MOD;
ret=(ret+slove(pos+1,2,2,a,b,c-1))%MOD;
}
else if(pre==0){
ret=(ret+slove(pos+1,fst,1,a,b-1,c))%MOD;
ret=(ret+slove(pos+1,fst,2,a,b,c-1))%MOD;
}
else if(pre==1){
ret=(ret+slove(pos+1,fst,0,a-1,b,c))%MOD;
ret=(ret+slove(pos+1,fst,2,a,b,c-1))%MOD;
}
else if(pre==2){
ret=(ret+slove(pos+1,fst,0,a-1,b,c))%MOD;
ret=(ret+slove(pos+1,fst,1,a,b-1,c))%MOD;
}
return dp[fst][pre][a][b][c]=ret;
}
int countArrangements(string cupcakes){
cnt[0]=cnt[1]=cnt[2]=0;
n=cupcakes.size();
for(int i=0;i<n;i++)
cnt[cupcakes[i]-'A']++;
memset(dp,-1,sizeof(dp));
return slove(0,0,0,cnt[0],cnt[1],cnt[2]);
}
};
/*
int dp[51][51][51][51][3];
int countArrangements(string cupcakes){
cnt[0]=cnt[1]=cnt[2]=0;
int n=cupcakes.size();
for(int i=0;i<n;i++)
cnt[cupcakes[i]-'A']++;
int ans=0;
for(int s=0;s<3;s++){
memset(dp,0,sizeof(dp));
if(s==0)
dp[1][1][0][0][0]=1;
else if(s==1)
dp[1][0][1][0][1]=1;
else
dp[1][0][0][1][2]=1;
for(int x=2;x<=n;x++){
for(int a=0;a<=cnt[0];a++)
for(int b=0;b<=cnt[1];b++)
for(int c=0;c<=cnt[2];c++)
if(a+b+c==x){
if(a){
dp[x][a][b][c][0]=(dp[x][a][b][c][0]+dp[x-1][a-1][b][c][1])%MOD;
dp[x][a][b][c][0]=(dp[x][a][b][c][0]+dp[x-1][a-1][b][c][2])%MOD;
}
if(b){
dp[x][a][b][c][1]=(dp[x][a][b][c][1]+dp[x-1][a][b-1][c][0])%MOD;
dp[x][a][b][c][1]=(dp[x][a][b][c][1]+dp[x-1][a][b-1][c][2])%MOD;
}
if(c){
dp[x][a][b][c][2]=(dp[x][a][b][c][2]+dp[x-1][a][b][c-1][1])%MOD;
dp[x][a][b][c][2]=(dp[x][a][b][c][2]+dp[x-1][a][b][c-1][0])%MOD;
}
}
}
ans+=(((-dp[n][cnt[0]][cnt[1]][cnt[2]][s]+dp[n][cnt[0]][cnt[1]][cnt[2]][0]+dp[n][cnt[0]][cnt[1]][cnt[2]][2]))+dp[n][cnt[0]][cnt[1]][cnt[2]][1])%MOD;
cout<<ans<<endl;
}
return ans;
}
*/