[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=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>map[i][j]; for(int i=1;i<=n;i++)l[i]=1,r[i]=n,h[i]=0; int ll,rr,ans=0; for(int i=1;i<=n;i++){ ll=0,rr=n+1; for(int j=1;j<=n;j++){ if(map[i][j])h[j]=0,l[j]=1,ll=j; else h[j]++,l[j]=max(l[j],ll+1); } for(int j=n;j>=1;j--){ if(map[i][j])r[j]=n,rr=j;//不要重复++与赋值 else r[j]=min(r[j],rr-1),ans=max(ans,h[j]*(r[j]-l[j]+1)); } } printf("%d\n",ans); return 0; }