题目来源:[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语句中先用了数组元素的值在对脚标进行了判断,而且对脚标的判断是错误的 ,可是程序并没有崩溃,而且正常结束了