转载请注明出处,谢谢 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; } };
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; } };
注释部分: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; } */