最长滑雪路(简单DP)

题目来源:[NWPU][2014][TRN][6]动态规划第一讲——简单线性dp E题

http://vjudge.net/contest/view.action?cid=49759#problem/E

题目:按照矩阵的形式给出一个R行C列的“雪地模拟区”,喜欢滑雪的MICHAEL想找出一个最长的滑雪路径,他只能向矩阵的左右或者是上子做出选择,并且他只能从高度高的位置      走到高度低的位置,矩阵的数值代表那个位置的高度,矩阵组大为100*100,高度最大为1000

作者:npufz

代码:

#include<iostream>
#include <cstring>
#include <cstdio>
using namespace std;
long dp(long n, long m,long f[103][103],long a[103][103],long x,long y)
{   if (f[x][y] != 0) return f[x][y];
	f[x][y] = 1;
    if (x>0&&(a[x - 1][y] < a[x][y]))    f[x][y] = max(f[x][y], dp(n, m,f,a,x-1,y) + 1);
    if (x<n-1&&(a[x + 1][y] < a[x][y]))  f[x][y] = max(f[x][y], dp(n, m,f,a,x+1,y) + 1);
    if (y>0&&(a[x][y - 1] < a[x][y]))    f[x][y] = max(f[x][y], dp(n, m,f,a,x,y-1) + 1);
    if (y<m-1&&(a[x][y + 1] < a[x][y]))  f[x][y] = max(f[x][y], dp(n, m,f,a,x,y+1) + 1);
    return f[x][y];
}
int main()
{long a[103][103],f[103][103],h,w,i,j,k,m;
cin>>h>>w;
for(i=0;i<h;i++)
    for(j=0;j<w;j++)
    {scanf("%ld",&a[i][j]);f[i][j]=0;}
    m=-1;
for(i=0;i<h;i++)
    for(j=0;j<w;j++)
{k=dp(h,w,f,a,i,j);
if(k>m) m=k;
} cout<<m<<endl;
return 0;
}

反思:由于出发位置有R*C种,所以对每一种出发进行计算时必定会出现重复计算的问题,所以可以记录各个出发位置可以走的最长的路径,当这个位置再次被更长的路径走                 到时直接把上次的结果拿来就可以了,一开始错误了,因为在判断数组是否越界时,在IF语句中先用了数组元素的值在对脚标进行了判断,而且对脚标的判断是错误的                 ,可是程序并没有崩溃,而且正常结束了



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值