Codeforces 375B Maximum Submatrix 2 (DP)

<题目链接>

题目大意:
给出一个01矩阵,行与行之间可以互换位置,问能够得到最大的全1矩阵的面积。

#include <bits/stdc++.h>
using namespace std;

const int N = 5e3+5;
int n,m;
int dp[N][N];
char mpa[N][N];

int main(){
    while(~scanf("%d%d",&n,&m)){
        for(int i=1;i<=n;i++)scanf("%s",mpa[i]+1);
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                if(mpa[i][j]=='1')dp[j][i]=dp[j-1][i]+1;    //在第i行内,以(i,j)这个点为末尾的最长连续1的数量
        int ans=0;
        for(int i=1;i<=m;i++){
            sort(dp[i]+1,dp[i]+1+n);     //在第i列,将该列所有的dp[i]全部排序
            for(int j=n;j>=1;j--)
                ans=max(ans,dp[i][j]*(n-j+1));
                //因为这样能够保证以这一列为矩阵的右边界,同时当前行以下的所有行的连续的1的个数一定大于等于当前行,所以能够这样一直向上递推构建合法的全1矩阵,只需要不断更新答案即可
        }printf("%d\n",ans);
    }
}

 

posted @ 2019-03-25 23:04  悠悠呦~  阅读(165)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end