www.bersaty.com

简单的动态规划dp

DieIng五一要去旅游,旅游区的景点道路分布如图:欣赏景点的道路为东西走向,每条道路有DieIng对它的喜爱值;南北走向为林间小道,供休息用。
由于五一游客较多,旅游区规定欣赏景点的道路只能单向行走,自东向西走;林间小道可双向行走。
DieIng要你帮他设计路线(可以从任意点开始,任意点结束),使得他能玩得最high。(喜爱值的总和最大)

Input

第一行是两个整数N(0 <= N <= 10) 和M(0 <= M <= 1000000), 代表旅游区的布局,N*M
接下来N行,每行有M个整数favorite(-100 <= favorite<=100)
N,M==0结束。

Output

输出DieIng能得到最大的喜爱值总和。

Sample Input

 

3 4
5 -4 6 14
-2 -48 11 -8
9 -13 4 8
0 0

 

 

Sample Output

 

30

 

每列求最大值后得到一维数组,然后就是求最大子串的问题了

#include<iostream>
using namespace std;
long int s[1000000];
int main()
{
long int i,j,sum,max,m,n,a,k;
while(scanf("%ld %ld",&n,&m)!=EOF&&n&&m)
{
max=-101,sum=0;
k=1;
memset(s,0,m*sizeof(long int));
for(i=0;i<n;i++)
{
if(k)
{
for(j=0;j<m;j++)
scanf("%ld",&s[j]);
k=0;
}
else
for(j=0;j<m;j++)
{
scanf("%ld",&a);
if(s[j]<a)
s[j]=a;
}
}
for(i=m-1;i>=0;i--)
{
sum+=s[i];
if(sum>max)
max=sum;
if(sum<0)
sum=0;
}
if(max>0)
printf("%ld\n",max);
else
printf("0\n");
}
return 0;
}



posted @ 2011-12-05 19:15  bersaty  阅读(219)  评论(0编辑  收藏  举报