HDU2830-Matrix Swapping II

来源:互联网 发布:sheme数据库方案 编辑:程序博客网 时间:2024/04/30 10:44

Matrix Swapping II

                                                                               Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
                                                                                                          Total Submission(s): 1896    Accepted Submission(s): 1269


Problem Description
Given an N * M matrix with each entry equal to 0 or 1. We can find some rectangles in the matrix whose entries are all 1, and we define the maximum area of such rectangle as this matrix’s goodness. 

We can swap any two columns any times, and we are to make the goodness of the matrix as large as possible.
 

Input
There are several test cases in the input. The first line of each test case contains two integers N and M (1 ≤ N,M ≤ 1000). Then N lines follow, each contains M numbers (0 or 1), indicating the N * M matrix
 

Output
Output one line for each test case, indicating the maximum possible goodness.
 

Sample Input
3 41011100100013 4101010010001
 

Sample Output
42Note: Huge Input, scanf() is recommended.
 

Source
2009 Multi-University Training Contest 2 - Host by TJU
 

题意:给你一个矩阵,里面的数字只有0和1两种,其中,列可以任意移动。问如何移动可以使某个子矩阵中元素全部是1,求出这个最大子矩阵的面积。

解题思路:枚举所有的尾行,然后对于每个尾行,记录到这行为止每列连续的1的个数,因为可以将列任意移动,肯定要尽量将高度大的放在一起,所以可以将高度从大到小排序,然后有h[i]>=h[i+1],即如果将1,2…i个矩形连在一起,它的高应该是h[i],所以面积显然是h[i] * i。


#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <vector>#include <set>#include <map>using namespace std;#define LL long longchar ch[1005][1005];int x[1005];int xx[1005];bool cmp(int a,int b){    return a>b;}int main(){     int n,m;     while(~scanf("%d %d",&n,&m))     {         int ans=0;         memset(x,0,sizeof x);         for(int i=1;i<=n;i++)         {             scanf("%s",ch[i]+1);             for(int j=1;j<=m;j++)             {                 if(ch[i][j]=='1') x[j]++;                 else x[j]=0;                 xx[j]=x[j];             }             sort(xx+1,xx+1+m,cmp);             for(int j=1;j<=m;j++)                 ans=max(ans,xx[j]*j);         }         printf("%d\n",ans);     }     return 0;}

0 0
原创粉丝点击