codeforces prblem 375 b

题意:给出个只有0,1的矩阵,我们可以交换任意行,问最大的全1矩阵面积是多少

思路:行的全1的段我们无法改变,所以得尽量把该列有1的这些行放在一起,然后根据能向左延伸多少全1格排序

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=5005;
 4 char s[N];
 5 int a[N][N];
 6 int dp[N][N];
 7 int b[N];
 8 bool cmp(int x,int y){
 9     return x>y;
10 }
11 int main(){
12     int n,m;
13     scanf("%d%d",&n,&m);
14     for(int i=1;i<=n;i++){
15         scanf("%s",s+1);
16         for(int j=1;j<=m;j++) a[i][j]=s[j]-'0';
17     }
18 
19     for(int i=1;i<=n;i++){
20         for(int j=1;j<=m;j++){
21             if(a[i][j]==1){
22                 dp[j][i]+=dp[j-1][i]+1;
23             }
24         }
25     }
26     //dp[i][j]表示第i列第j行向左最多延长多少
27     int Max=0;
28     for(int i=1;i<=m;i++){
29         for(int j=1;j<=n;j++){
30             b[j]=dp[i][j];
31 
32         }
33         sort(b+1,b+1+n);
34         for(int k=n;k>=1;k--){
35             if(b[k]==0) break;
36             Max=max(Max,b[k]*(n-k+1));
37         }
38     }
39     cout<<Max<<endl;
40 }
原文地址:https://www.cnblogs.com/hhxj/p/7250863.html