hdu 2830 Matrix Swapping II(hdu1505的加强版)

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1005
using namespace std;

const int INF=1<<30;
char mat[N][N];
int a[N][N];
int L[N],R[N];

int main()
{
    int m,n;
    memset(a,0,sizeof(0));
    while(scanf("%d%d",&m,&n)==2)
    {
        for(int i=1;i<=m;i++)
        {
            scanf("%s",mat[i]+1);
            for(int j=1;j<=n;j++)
            {
                if(mat[i][j]=='1')
                    a[i][j]=1;
                else
                    a[i][j]=0;
            }
        }
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(a[i][j]==1)
                    a[i][j]+=a[i-1][j];
            }
        }
        int ans=-INF;
        for(int i=1;i<=m;i++)
        {
            sort(a[i]+1,a[i]+1+n);
            for(int j=1;j<=n;j++)
            {
                L[j]=j;
                while(L[j]>1&&a[i][L[j]-1]>=a[i][j])
                    L[j]=L[L[j]-1];
            }
            for(int j=n;j>=1;j--)
            {
                R[j]=j;
                while(R[j]<n&&a[i][R[j]+1]>=a[i][j])
                    R[j]=R[R[j]+1];
            }
            for(int j=1;j<=n;j++)
            {
                ans=max(ans,a[i][j]*(R[j]-L[j]+1));
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(dp)