【Codevs 2630】宝库通道

http://codevs.cn/problem/2630/

Solution

预处理f[i][j],代表第j列前i行的代价

枚举上下界,然后做最大子段和,g[i]代表选到第i列的代价,

  g[k]=(g[k-1]<0?0:g[k-1])+f[j][k]-f[i-1][k]

复杂度O(n^3)

Notice

注意赋初值

// <2630.cpp> - Tue Oct 18 20:36:24 2016
// This file is made by YJinpeng,created by XuYike's black technology automatically.
// Copyright (C) 2016 ChangJun High School, Inc.
// I don't know what this program is.

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int MAXN=410;
int g[MAXN],f[MAXN][MAXN];
int main()
{
    freopen("2630.in","r",stdin);
    freopen("2630.out","w",stdout);
    int n,m,ans=0;scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            char ch=getchar();
            while(ch!='0'&&ch!='1')ch=getchar();
            f[i][j]=f[i-1][j]+(ch=='0'?-1:1);
        }
    for(int i=1;i<=n;i++)
        for(int j=i;j<=n;j++)
            for(int k=1;k<=m;k++)
                g[k]=(g[k-1]<0?0:g[k-1])+f[j][k]-f[i-1][k],ans=max(g[k],ans);
    printf("%d\n",ans);
    return 0;
}

 

posted @ 2016-10-18 21:28  _Mashiro  阅读(209)  评论(0编辑  收藏  举报