TC SRM 551 div2 题解

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







你可能感兴趣的:(C++,c,String,Class,ini,div)