【题解】
题意:给定一个包含0和1的矩阵,输出矩形内都是1的第二大的矩形的大小。
思路:运用前缀和思想跑出每行的子前缀和,即每个位置前面到这个位置一共有多少个连续的1。然后从右下角往上跑,每次固定长度,更新最小宽度,算出当前最大矩形的大小,更新答案。
【代码】
#include <bits/stdc++.h>
using namespace std;
const int maxn=1005;
int a[maxn][maxn];
int h[maxn][maxn];
int main()
{
int n,m; scanf("%d%d",&n,&m);
int cnt=0;
//跑出每行的子前缀和
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%1d",&a[i][j]);
if(a[i][j]){
h[i][j]=h[i-1][j]+1;
cnt++;
}
}
}
if(cnt==1) puts("0");
else{
int m1=0,m2=0,flag=1;
for(int i=n;i>=1;i--){
for(int j=m;j>=1;j--){
if(!h[i][j]) continue;
int mi=h[i][j];
for(int k=j;k&&h[i][k];k--){
if(mi*j<=m2) break;
mi=min(mi,h[i][k]); //矩形最小宽
int m=(j-k+1)*mi; //长*宽=矩形size
//更新最大值和第二大值
if(m>=m1){
m2=m1,m1=m;
}
else{
if(m>=m2) m2=m;
}
}
}
}
printf("%d\n",m2);
}
return 0;
}
【题面】