[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