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; }
相关文章推荐
- POJ 1088 滑雪 (记忆化搜索)
- POJ 1088 滑雪 (记忆化搜索)
- POJ 1088 滑雪 记忆化搜索
- POJ 1088 滑雪 (记忆化搜索)
- poj1088滑雪【记忆化搜索 初级题】
- poj 1088 滑雪 记忆化搜索
- 滑雪 POJ - 1088 (记忆化搜索)
- 滑雪_poj_1088(记忆化搜索).java
- POJ 1088 滑雪 DFS 记忆化搜索
- POJ 1088 滑雪 (记忆化搜索)
- POJ 1088 滑雪(记忆化搜索+dfs)
- 滑雪(POJ 1088 记忆化搜索)
- POJ 1088 滑雪【记忆化搜索】
- poj 1088滑雪(记忆化搜索, dp)
- poj 1088 滑雪(记忆化搜索)
- poj 1088 滑雪(动态规划:记忆化搜索)
- [ACM] poj 1088 滑雪 (记忆化搜索DFS)
- poj1088 滑雪 记忆化搜索
- (poj 1088 滑雪) <记忆化搜索>
- POJ 1088滑雪(记忆化搜索)