[codevs1159]最大全0子矩阵(悬线法)

时间:2023-03-09 22:20:00
[codevs1159]最大全0子矩阵(悬线法)

解题关键:悬线法模板题。注意此模板用到了滚动数组。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
#define maxn 2002
using namespace std;
typedef long long ll;
int map[maxn][maxn],l[maxn],r[maxn],h[maxn];
int n;
int main(){
cin>>n;
for(int i=;i<=n;i++)for(int j=;j<=n;j++)cin>>map[i][j];
for(int i=;i<=n;i++)l[i]=,r[i]=n,h[i]=;
int ll,rr,ans=;
for(int i=;i<=n;i++){
ll=,rr=n+;
for(int j=;j<=n;j++){
if(map[i][j])h[j]=,l[j]=,ll=j;
else h[j]++,l[j]=max(l[j],ll+);
}
for(int j=n;j>=;j--){
if(map[i][j])r[j]=n,rr=j;//不要重复++与赋值
else r[j]=min(r[j],rr-),ans=max(ans,h[j]*(r[j]-l[j]+));
}
}
printf("%d\n",ans);
return ;
}