您的位置:首页 > 其它

洛谷Oj-Likecloud-吃、吃、吃-多维动态规划

2017-06-27 17:08 211 查看
问题描述

正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一直处在饥饿的状态中。某日上课,正当他饿得头昏眼花之时,眼前突然闪现出了一个n*m(n and m<=200)的矩型的巨型大餐桌,而自己正处在这个大餐桌的一侧的中点下边。餐桌被划分为了n*m个小方格,每一个方格中都有一个圆形的巨型大餐盘,上面盛满了令李大水牛朝思暮想的食物。李大水牛已将餐桌上所有的食物按其所能提供的能量打了分(有些是负的,因为吃了要拉肚子),他决定从自己所处的位置吃到餐桌的另一侧,但他吃东西有一个习惯——只吃自己前方或左前方或右前方的盘中的食物。

由于李大水牛已饿得不想动脑了,而他又想获得最大的能量,因此,他将这个问题交给了你。

每组数据的出发点都是最后一行的中间位置的下方!

AC代码①(自下而上)

#define ll long long
#define inf 0x7fffffff
using namespace std;
int a[2001][2001],dp[2001][2001];
int max1(int a,int b)//取较大比较函数
{
return a>b?a:b;
}
int max2(int a,int b,lint c)//取最大比较函数
{
int t;
if(a>b)
t=a;
else
t=b;
if(c>t)
return c;
else
return t;
}
int main()
{
int m,n,i,j,start,begin,max=-inf;
scanf("%d%d",&m,&n);//输入
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
begin=0;
start=n/2+1;
for(i=m;i>=1;i--)
{
begin++;
if(start-begin>=1&&start+begin<=n)//防止越界
for(j=start-begin;j<=start+begin;j++)
{
if(j==start-begin)//边界
dp[i][j]=a[i][j]+dp[i+1][j+1];
else if(j==start+begin)//边界
dp[i][j]=a[i][j]+dp[i+1][j-1];
else if(j==start-begin+1)//边界
dp[i][j]=a[i][j]+max1(dp[i+1][j],dp[i+1][j+1]);
else if(j==start+begin-1)//边界
dp[i][j]=a[i][j]+max1(dp[i+1][j],dp[i+1][j-1]);
else
dp[i][j]=a[i][j]+max2(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1]);
}
else
for(j=1;j<=n;j++)
{
if(j==1)//边界
dp[i][j]=a[i][j]+max1(dp[i+1][j],dp[i+1][j+1]);
else if(j==n)//边界
dp[i][j]=a[i][j]+max1(dp[i+1][j],dp[i+1][j-1]);
else
dp[i][j]=a[i][j]+max2(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1]);
}
}
for(j=1;j<=n;j++)//比较
max=max1(max,dp[1][j]);
printf("%d\n",max);//打印
return 0;
}


解决方法:此题与数字三角形做法完全相同,用自上而下的递推方法比较简单,省去了繁琐的判断过程

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