【例题】【动规(最大连续子序列)】NKOJ 1049 最佳游览

来源:互联网 发布:红蜘蛛端口号怎么修改 编辑:程序博客网 时间:2024/05/23 13:10

NKOJ 1049 最佳游览
时间限制 : 1000 MS 空间限制 : 65536 KB

问题描述
有一座旅游城,它的街道成网格状(如下表).其中东西向(左右方向)的街道是“风景线”上面分布着许多景点。南北向(上下方向)的街道都是林萌道,两旁看不到任何建筑物。由于游客众多,“游览线”被规定为单行道,游客在风景线上只能从西走到东(从左往右),林萌道上则可以任意行走。
一名游客将到这座旅游城旅游。他根据自己对景观的喜好给所有的景点打了分,分值是从-100到+100的整数,分值越大表示我们的旅游者越喜欢这里的景致。显然这位游客不可能给这座旅游城的所有景点都打负分。如下图,该城市共有三条从西往东的风景线,每条线上的每个景点都被标上了分值。竖列间的南北走向的空白区域就是林萌道
-50 –47 36 –30 –23
17 –19 -34 –13 –8
-42 –3 -43 34 -45
游客可以从旅游城的任一个景点开始游览,在任一个景点结束游览。我们的旅游者希望一路上游览的所有景点的分值之和能够尽可能地大。请你写一个程序,帮助这位游客寻找一条最佳的游览路线。

输入格式
第一行是两个整数M和N,之间用一个空格符隔开,
N表示旅游城南北向林萌道的条数,M表示东西向风景线的层数,l<=M<=100,1<=N<=20000。
接下来的M行依次给出了由西向东(从左到右)各条风景线上景点的分值信息。每行有N-1个整数,依次表示了该风景线上自西向东每个景点的分值。同一行相邻两个数之间用一个空格隔开。

输出格式
只有一行,含一个整数,表示你的程序所找到的最佳游览路线的总分值。

样例输入
3 6
-50 -47 36 -30 -23
17 -19 -34 -13 -8
-42 -3 -43 34 -45

样例输出
84

提示
样例数据的最佳路线是:从17经过-3经过36到达34,总分值为84.

来源 NOI97

思路:
将每列最大数找出,存入b[]数组中,对b进行最大子串模型即可

代码:

#include<iostream>#include<cstdio>using namespace std;int n,m,a[200][20002],b[20002],f[20002],maxx;int main(){    int s,ans=-101;    scanf("%d%d",&m,&n);    n-=1;    for(int i=1;i<=m;i++)     for(int j=1;j<=n;j++)      {        scanf("%d",&a[i][j]);      }    for(int i=1;i<=n;i++)    {        maxx=a[1][i];        for(int j=2;j<=m;j++) if(a[j][i]>maxx) maxx=a[j][i];        b[i]=maxx;    }    f[1]=b[1];ans=b[1];    for(int i=2;i<=n;i++)    {        if(f[i-1]>0) f[i]=b[i]+f[i-1];        else f[i]=b[i];        if(f[i]>ans) ans=f[i];    }    printf("%d",ans);}
0 0
原创粉丝点击