HDU 2830 Matrix Swapping II

暴力枚举+DP预处理。

可以枚举矩形底边是哪一行,枚举到一行的时候,计算以该行为底边,最大矩形面积是多少。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

const int maxn=1000+10;
char s[maxn][maxn];
int a[maxn][maxn];
int dp[maxn][maxn];
int tmp[maxn];
int n,m;
int ans;

void read()
{
    for(int i=0;i<n;i++) scanf("%s",s[i]);
    for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j]=s[i-1][j-1]-'0';
}

void init()
{
    ans=0;
    memset(dp,0,sizeof dp);
}

void work()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(a[i][j]==0) dp[i][j]=0;
            else dp[i][j]=dp[i-1][j]+1;
        }
    }


    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            tmp[j]=dp[i][j];
        }
        sort(tmp+1,tmp+1+m);
        for(int i=1;i<=m;i++) ans=max(ans,(m-i+1)*tmp[i]);
    }
    printf("%d
",ans);
}

int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        read();
        init();
        work();
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/5308219.html