题意:
给你一个01矩阵,行与行之间可以交换位置
然后问你构成构成最大的只含1的矩形的面积是多少
思路:
首先我们预处理一下
dp[j][i]表示第j列第i行往左边最远能延长多远
因为列是不会变的,所以我们对于每一列都排序(贪心?),然后利用dp的思想往下找
到dp[i][j]==0的时候break,因为显然剩下的都是0了
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn = 5e3+10; 5 const int INF = 0x3f3f3f3f; 6 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL; 7 inline ll read(){ 8 ll x=0,f=1;char ch=getchar(); 9 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 10 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 11 return x*f; 12 } 13 ////////////////////////////////////////////////////////////////////////// 14 15 char s[maxn][maxn]; 16 int dp[maxn][maxn]; 17 18 bool cmp(int x,int y){ 19 return x > y; 20 } 21 22 int main(){ 23 int n,m; n=read(),m=read(); 24 for(int i=1; i<=n; i++) 25 gets(s[i]+1); 26 27 memset(dp,0,sizeof(dp)); 28 for(int i=1; i<=n; i++){ 29 for(int j=1; j<=m; j++){ 30 if(s[i][j] == '1'){ 31 dp[j][i] = dp[j-1][i]+1; 32 } 33 // cout << dp[j][i] << " "; 34 } 35 // cout << endl; 36 } 37 38 int ans = 0; 39 for(int j=1; j<=m; j++){ 40 sort(dp[j]+1,dp[j]+1+n,cmp); 41 for(int i=1; i<=n; i++){ 42 if(dp[j][i] == 0) break; 43 ans = max(dp[j][i]*i,ans); 44 } 45 } 46 47 cout << ans << endl; 48 49 return 0; 50 } 51 52 // 4 4 53 // 0111 --> 0 1 2 3 1 2 3 4 54 // 1101 --> 1 2 0 1 按列排序==> 1 2 2 3 55 // 1111 --> 1 2 3 4 0 1 0 1 56 // 0001 --> 0 0 0 1 0 0 0 1