题意:
给你一个01矩阵,行与行之间可以交换位置
然后问你构成构成最大的只含1的矩形的面积是多少
思路:
首先我们预处理一下
dp[j][i]表示第j列第i行往左边最远能延长多远
因为列是不会变的,所以我们对于每一列都排序(贪心?),然后利用dp的思想往下找
到dp[i][j]==0的时候break,因为显然剩下的都是0了
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 5e3+10;
const int INF = 0x3f3f3f3f;
const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
inline ll read(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
//
char s[maxn][maxn];
int dp[maxn][maxn];
bool cmp(int x,int y){
return x > y;
}
int main(){
int n,m; n=read(),m=read();
for(int i=1; i<=n; i++)
gets(s[i]+1);
memset(dp,0,sizeof(dp));
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
if(s[i][j] == '1'){
dp[j][i] = dp[j-1][i]+1;
}
// cout << dp[j][i] << " ";
}
// cout << endl;
}
int ans = 0;
for(int j=1; j<=m; j++){
sort(dp[j]+1,dp[j]+1+n,cmp);
for(int i=1; i<=n; i++){
if(dp[j][i] == 0) break;
ans = max(dp[j][i]*i,ans);
}
}
cout << ans << endl;
return 0;
}
// 4 4
// 0111 --> 0 1 2 3 1 2 3 4
// 1101 --> 1 2 0 1 按列排序==> 1 2 2 3
// 1111 --> 1 2 3 4 0 1 0 1
// 0001 --> 0 0 0 1 0 0 0 1