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 }