poj 1088 滑雪 DP(dfs的记忆化搜索)

题目地址:http://poj.org/problem?id=1088

题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 求最大的下滑路径

分析:因为只能从高峰滑到低峰,无后效性,所以每个点都可以找到自己的最长下滑距离(只与自己高度有关)。记忆每个点的最长下滑距离,当有另一个点的下滑路径遇到这个点的时候,直接加上这个点的最长下滑距离。

dp递推式是,dp[x][y] = max(dp[x][y],dp[x+1][y]+1,dp[x][y-1]+1,dp[x-1][y]+1,dp[x][y+1]+1);

 1 #include<cstdio>
 2 #include<queue>
 3 #include<algorithm>
 4 //dp[x][y]表示 (x,y)这个点的最长下滑路径
 5 using namespace std;
 6 const int maxn = 102;
 7 using namespace std;
 8 int n, m,bx,by,ans;
 9 int G[maxn][maxn];
10 int dp[maxn][maxn];
11 int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};//这种图的搜索 可以把方向写在一个数组中 使代码更简洁
12 int dfs(int x, int y)
13 {
14     if(dp[x][y])//如果之前已经有结果 那么直接使用
15     {
16         return dp[x][y];
17     }
18     for(int i = 0; i < 4;i++)
19     {
20         int tx = x,ty = y;
21         tx += dir[i][0];
22         ty += dir[i][1];
23 //        下面2个if都是排除非法情况
24         if(tx < 0 || tx >= n || ty < 0 || ty >= m) continue;
25         if(G[tx][ty] >= G[x][y]) continue;
26 //        如果四周的点都比自己高 或者路径长没自己长 那么不更新 否则更新为四周的点+1
27         dp[x][y] = max(dp[x][y],dfs(tx,ty)+1);
28     }
29     return dp[x][y];
30
31 }
32 int main()
33 {
34
35     scanf("%d %d", &n,&m);
36     for(int i = 0;i < n; i++)
37     {
38         for(int j = 0; j < m; j++)
39         {
40             scanf("%d", &G[i][j]);
41
42         }
43     }
44     ans = 0;
45     for(int i =0; i < n; i++)
46     {
47         for(int j = 0; j < m; j++)
48         dfs(i,j);
49     }
50     for(int i =0; i < n; i++)
51     {
52         for(int j = 0; j < m; j++)
53          ans = max(ans,dp[i][j]);
54     }
55     printf("%d",ans+1);//因为自己也算做一步 所以ans+1
56
57     return 0;
58 }
时间: 2024-10-10 19:31:41

poj 1088 滑雪 DP(dfs的记忆化搜索)的相关文章

POJ 1088 滑雪(简单的记忆化dp)

题目 又一道可以称之为dp的题目,虽然看了别人的代码,但是我的代码写的还是很挫,,,,,, //看了题解做的简单的记忆化dp #include<stdio.h> #include<algorithm> #include<iostream> using namespace std; int mp[110][110],dp[110][110]; int xx[]={1,-1,0,0}; int yy[]={0,0,1,-1}; int n,m; int dfs(int x,

HDOJ 题目1088 滑雪(DFS,记忆化)

滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 80448   Accepted: 29995 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子 1 2 3 4 5 16 17

poj 1088 动态规划+dfs(记忆化搜索)

滑雪 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个 区域中最长底滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子 1 2 3 4 5 16 17 18 19 6

POJ 2704 Pascal&#39;s Travels (基础记忆化搜索)

Pascal's Travels Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5328   Accepted: 2396 Description An n x n game board is populated with integers, one nonnegative integer per square. The goal is to travel along any legitimate path from t

hdu4753 状态压缩dp博弈(记忆化搜索写法)

http://acm.hdu.edu.cn/showproblem.php?pid=4753 Problem Description There is a 3 by 3 grid and each vertex is assigned a number. It looks like JiuGongGe, but they are different, for we are not going to fill the cell but the edge. For instance, adding

NYOJ16|嵌套矩形|DP|DAG模型|记忆化搜索

矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中.你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内. 输入 第一行是一个正正数N(0<N<10),表示测试数据组数,每组测

poj 1609 Tiling Up Blocks dp入门之记忆化搜索

题意: 给n个二元组(a,b),要在其中找最长的序列,使得对序列中的任意i<j,有ai<=aj且bi<=bj. 分析: 设dp[a][b]代表以(a,b)结尾的最长序列长度,记忆化搜索即可. 代码: //poj 1609 //sep9 #include <iostream> using namespace std; const int max_p=128; int n; int num[max_p][max_p]; int dp[max_p][max_p]; int sear

ACM学习历程—ZOJ3471 Most Powerful(dp &amp;&amp; 状态压缩 &amp;&amp; 记忆化搜索 &amp;&amp; 位运算)

Description Recently, researchers on Mars have discovered N powerful atoms. All of them are different. These atoms have some properties. When two of these atoms collide, one of them disappears and a lot of power is produced. Researchers know the way

POJ 1579 Function Run Fun 【记忆化搜索入门】

题目传送门:http://poj.org/problem?id=1579 Function Run Fun Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20560   Accepted: 10325 Description We all love recursion! Don't we? Consider a three-parameter recursive function w(a, b, c): if a <=

换根dp+暴力+预处理+记忆化搜索——cf1292C好题!

/** 给定一棵树,要求给树边赋值[0,n-2],每个值只能使用一次 S = mex(u,v), mex(u,v)是u-v路径上没有出现过的编号最小的值 问使得S最大的赋值方式 由于很难直接统计答案,所以考虑统计每条边的贡献 包含(0)路径的贡献tot1是其左右子树size的乘积 包含(0,1)的路径的贡献tot2是其左右子树的size乘积 ...依次类推 显然:只包含(1,2)这样的路径是没有贡献的 那么原问题转化为如何分配[0,n-2],使得最后的乘积和最大 dp[u][v]表示路径(u,v