POJ 1088 滑雪【记忆化搜索】

时间:2024-11-23 08:07:25

题意:给出一个二维矩阵,要求从其中的一点出发,并且当前点的值总是比下一点的值大,求最长路径

记忆化搜索,首先将d数组初始化为0,该点能够到达的路径长度保存在d数组中,同时把因为路径是非负的,所以如果已经计算过某个点,那么这个点的d一定是正的,所以每次搜的时候判断一下d[i][j],如果是正的,就不用再计算了。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<algorithm>
using namespace std; typedef long long LL;
int a[][],d[][],n,m;
int dir[][]={,,-,,,,,-}; int dfs(int x,int y){
if(d[x][y]) return d[x][y];//如果已经搜过这一点,则直接返回,不用再重复计算
int ans=;
for(int i=;i<;i++){ //四个 方向搜
int nx=x+dir[i][];
int ny=y+dir[i][];
if(nx<||nx>n||ny<||ny>m) continue;//越界
if(a[x][y]>a[nx][ny])
ans=max(ans,+dfs(nx,ny));
} if(ans==) return d[x][y]=;
return d[x][y]=ans;
} int main()
{
while(scanf("%d %d",&n,&m)!=EOF){
for(int i=;i<=n;i++)
for(int j=;j<=m;j++) cin>>a[i][j]; memset(d,,sizeof(d));
int tmp=; for(int i=;i<=n;i++){
for(int j=;j<=m;j++)
tmp=max(tmp,dfs(i,j));
}
printf("%d\n",tmp);
}
return ;
}