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);
    }
}

 

转载于:https://www.cnblogs.com/00isok/p/10597468.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值