您的位置:首页 > 大数据 > 人工智能

cf#22-B-Bargaining Table-枚举+贪心+dp(最大连续区间和)

2016-01-30 12:01 471 查看
http://codeforces.com/problemset/problem/22/B

cf#22-B 此题与POJ1050一样,求0-1矩阵中的 最大一块子矩阵,1050中是求和最大,本题要求矩阵所有元素为0,都是n^2枚举子矩阵的上下边界,把二维子矩阵逐行累加存到一位数组表示该列之和,然后用o(n)扫描,求连续的最大的零个数

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <cmath>
#include <iostream>
using namespace std;
const double pi=acos(-1.0);
const double eps=1e-6;

int tm[28][28];
int sum[28][28] ;
int tmp[28];
int main()
{
int n,m;
int i,j,k;
cin>>n>>m;
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
sum[i][j]=sum[i-1][j];
for (j=1;j<=m;j++)
{
scanf("%1d",&tm[i][j]);
sum[i][j]+=tm[i][j];
}
}
int ans=0;
for (i=1;i<=n;i++)
{
for (j=i;j<=n;j++)
{

memset(tmp,0,sizeof(tmp));
for (k=1;k<=m;k++)
{
tmp[k]=sum[j][k]-sum[i-1][k];
}
int cun=0;
for (k=1;k<=m;k++)
{
if (tmp[k]==0)
{
cun++;
}
else
{
if (cun==0)continue;
if (2*(cun+j-i+1)>ans) ans=2*(cun+j-i+1);
cun=0;
}
}
if (cun)
if (2*(cun+j-i+1)>ans) ans=2*(cun+j-i+1);
}
}
printf("%d\n",ans);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: