您的位置:首页 > 其它

POJ 1088 滑雪(记忆化搜索)

2013-08-12 01:10 155 查看
题意:给出一个图,求出最长的下降序列的长度。

思路:每次从一个点出发找到最长的距离并将距离保存下来,这样在之后搜索的过程中,我们可以利用到之前搜到的结果,当我们需要使用之前结果时直接调用,不用再次计算。记忆化搜索的想法就是这样,其实实现也是相当简单的,只需在之前搜索的代码上加一个判断语句就够了。

//DP+DFS
#include<stdio.h>
int r,c,height[120][120],dp[120][120];
int dx[10]={-1,1,0,0},dy[10]={0,0,-1,1};//上下左右

int max(int x,int y)
{
if(x>y)
return x;
return y;
}

int dfs(int x,int y)
{
if(dp[x][y])//如果该点已经被搜索过则不再继续搜索(省去大量的重复计算)
return dp[x][y];
for(int t=0;t<4;t++)//每次从该点出发一直搜索到最远的距离为止
{
int xx=x+dx[t],yy=y+dy[t];
if(xx>=1&&xx<=r&&yy>=1&&yy<=c&&height[x][y]<height[xx][yy])
dp[x][y]=max(dfs(xx,yy)+1,dp[x][y]);
}
return dp[x][y];
}

int main()
{
int i,j;
scanf("%d%d",&r,&c);
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
{
scanf("%d",&height[i][j]);
dp[i][j]=0;
}
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
dfs(i,j);
int ans=-1;
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
if(ans<dp[i][j]+1)
ans=dp[i][j]+1;
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: