锰锌袜子跪求调咕噜论坛(P8472)Orz
  • 板块灌水区
  • 楼主matrix69
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/10/3 20:26
  • 上次更新2023/10/27 08:58:41
查看原帖
锰锌袜子跪求调咕噜论坛(P8472)Orz
755375
matrix69楼主2022/10/3 20:26

本蒟蒻调了一晚上了 QwQ

#include<bits/stdc++.h>
using namespace std;
char mz[600][600];
bool b[600][600],g[600][600],p[600][600];//记录这个地方是不是这个颜色 
int ahp[600][600],ahg[600][600],ahb[600][600];//记录以这个地方结尾的矩阵有多少这个颜色,即前缀和 
int main()
{
	int n,m,k,ll,rr,ss,xx;//依次是:输入的n,m,k,最后答案中颜色一致的最大矩阵的四个端点(左,右,上,下界限) 
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>mz[i][j];
			if(mz[i][j]=='B') b[i][j]=1;
			if(mz[i][j]=='P') p[i][j]=1;
			if(mz[i][j]=='G') g[i][j]=1;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			ahb[i][j]=ahb[i-1][j]+ahb[i][j-1]-ahb[i-1][j-1]+b[i][j];
			ahp[i][j]=ahp[i-1][j]+ahp[i][j-1]-ahp[i-1][j-1]+p[i][j];
			ahg[i][j]=ahg[i-1][j]+ahg[i][j-1]-ahg[i-1][j-1]+g[i][j];//计算前缀和 
		}
	}
	int ans=0;//记录答案 最大子矩阵大小 
	char ahh;//最后要改成这个颜色 
	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j++){
			for(l=1,r=0;l<=n&&r<=n;l++){
				while(r<m&&ahp[j][r+1]-ahp[i-1][r+1]-ahp[j][l-1]+ahp[i-1][l-1]==0&&ahb[j][r+1]-ahb[i-1][r+1]-ahb[j][l-1]+ahb[i-1][l-1]+k>=(r+1-l+1)*(j-i+1)) r++;
                   // 没超过界限 且没有紫名 且 需要修改的在k次以内 
				if(ahp[j][r+1]-ahp[i-1][r+1]-ahp[j][l-1]+ahp[i-1][l-1]==0&&ans<(r+1-l+1)*(j-i+1)) {
				    //没有紫名 且答案更优 
					ans=(r-l+1)*(j-i+1); 
					ll=l;rr=r;ss=i;xx=j;ahh='B';//修改答案相关信息 即最优子阵四个边界位置以及颜色 
				}
			}
			for(l=1,r=0;l<=n&&r<=n;l++){
				while(r<m&&ahp[j][r+1]-ahp[i-1][r+1]-ahp[j][l-1]+ahp[i-1][l-1]==0&&ahg[j][r+1]-ahg[i-1][r+1]-ahg[j][l-1]+ahg[i-1][l-1]+k>=(r+1-l+1)*(j-i+1)) r++;
				if(ahp[j][r+1]-ahp[i-1][r+1]-ahp[j][l-1]+ahp[i-1][l-1]==0&&ans<(r+1-l+1)*(j-i+1)) {
					ans=(r-l+1)*(j-i+1);
					ll=l;rr=r;ss=i;xx=j;ahh='G';
				}
			}//同上 
			for(l=1,r=0;l<=n&&r<=n;l++){
				while(r<m&&ahp[j][r+1]-ahp[i-1][r+1]-ahp[j][l-1]+ahp[i-1][l-1]==(r+1-l+1)*(j-i+1)) r++;
				   //没超过边界 且全都是紫名 
				if(ans<(r+1-l+1)*(j-i+1)) {
					ans=(r-l+1)*(j-i+1);
					ll=l;rr=r;ss=i;xx=j;ahh='P';//貌似没必要?如果最优子矩阵是紫名就不需要修改了,直接输出原矩阵? 
				}			
			}
		}
	}
	cout<<ans;
	for(int i=ss;i<=xx;i++){
		for(int j=ll;j<=rr;j++){
			mz[i][j]=ahh;//修改为最优 
		}
	}
	cout<<endl;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cout<<mz[i][j];
		}
		cout<<endl;
	}
	return 0;//核情核理 
}
2022/10/3 20:26
加载中...