问题描述:
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 4 1011 1001 0001 3 4 1010 1001 0001Sample Output
4
2
题目分析:给我们一个矩阵,问我们最大全1矩阵的面积。注意矩阵的每一列都可以交换。
题目题意:预处理一下就好了,其实都不算dp的
代码如下:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e3+100;
char arr[maxn][maxn];
int dp[maxn][maxn];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int n,m;
while (scanf("%d%d",&n,&m)!=EOF) {
for (int i=1;i<=n;i++) {
scanf("%s",arr[i]+1);
}
memset (dp,0,sizeof (dp));
for (int j=1;j<=m;j++) {
for (int i=n;i>=1;i--) {
if (arr[i][j]=='1') dp[i][j]=dp[i+1][j]+1;
else dp[i][j]=0;
}
}
int ans=0;
for (int i=1;i<=n;i++) {
sort(dp[i]+1,dp[i]+1+m,cmp);
int res=0;
for (int j=1;j<=m;j++)
res=max(res,dp[i][j]*j);
ans=max(ans,res);
}
printf("%d\n",ans);
}
return 0;
}