dp cf B. Maximum Submatrix 2

来源:互联网 发布:沈阳网络电玩城 编辑:程序博客网 时间:2024/06/05 12:07

链接:http://codeforces.com/problemset/problem/375/B#include <algorithm>

可以改变行的位置,求最大的矩形的大小(1的个数,且矩形中只能有1)

思路:

用hash处理

ans[nmax][nmax]先记录每行连续的1的位置

然后转移方程dp[i][j]表示第i列至第j列中有连续的1的行的个数

i >= 1:dp[i][j]+=dp[i-1][j]+dp[i][j+1]-dp[i-1][j+1],sum = max(sum,dp[i][j]*(j-i+1));

i = 0:  dp[i][j]+=dp[i][j+1],sum = max(sum,dp[i][j]*(j-i+1));


#include <algorithm>#include <cstring>#include <iostream>#include <cstdio>using namespace std;#define MAX 5005int dp[MAX][MAX];char ans[MAX][MAX];int main(void){int n,m;cin >> n >>m;for(int i = 1;i<=n;i++)scanf("%s",ans[i]);for(int i = 1;i <=n;i++)for(int j = 0;j<m;){int s,e;s = j;while(ans[i][j]=='1'&&j < m)j++;e = j;if(ans[i][s] == '1')dp[s][e-1]++;else j++;}int sum = 0;for(int i = 0; i < m;i++)for(int j = m-1;j >= i;j--){if(i)dp[i][j]+=dp[i-1][j]+dp[i][j+1]-dp[i-1][j+1],sum = max(sum,dp[i][j]*(j-i+1));else dp[i][j]+=dp[i][j+1],sum = max(sum,dp[i][j]*(j-i+1));}cout << sum <<endl;}


0 0
原创粉丝点击