其他分享
首页 > 其他分享> > [ZJOI2007] 棋盘制作

[ZJOI2007] 棋盘制作

作者:互联网

悬线法

即计算出一个图形中最大矩形面积的DP方法

代码如下,很好懂

#include<bits/stdc++.h>
using namespace std;
int n,m,h[2001][2001],l[2001][2001],r[2001][2001],p[2001][2001],ans1=1,ans2=1;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			scanf("%d",&p[i][j]);
			if(i!=1){
				if(p[i][j]!=p[i-1][j])
					h[i][j]=h[i-1][j]+1;else h[i][j]=1;
			}
			else h[i][j]=1;
			if(j!=1){
				if(p[i][j]!=p[i][j-1])
					l[i][j]=l[i][j-1]+1;else l[i][j]=1;
			}
			else l[i][j]=1;
		}
		r[i][m]=1;
		for(int j=m-1;j;j--)
			if(p[i][j]!=p[i][j+1])
				r[i][j]=r[i][j+1]+1;else r[i][j]=1;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(h[i][j]>1){
				l[i][j]=min(l[i][j],l[i-1][j]);
				r[i][j]=min(r[i][j],r[i-1][j]);
			}
			int Y=h[i][j],X=r[i][j]+l[i][j]-1;
			ans2=max(ans2,X*Y);
			X=min(X,Y);
			ans1=max(ans1,X*X);
		}
	}cout<<ans1<<endl<<ans2;
}

标签:min,int,ans1,ans2,2001,max,ZJOI2007,棋盘,制作
来源: https://www.cnblogs.com/GUOGaby/p/14019788.html