一、题目

Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子

1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-…-3-2-1更长。事实上,这是最长的一条。

二、解题思路

动态规划解题思路可详见另一篇文章。

  1. 设二维数组dp[i][j]表示从(i,j)滑到低坡的最大长度。
  2. 解题技巧:在矩阵周围加入数值为正无穷大数值(INT_MAX);
  3. If exist a[i][j] > a[i-1][j] or  a[i][j] > a[i][j-1]  or  a[i][j] > a[i+1][j] or a[i][j] >  a[i][j+1]                                                                          dp[i][j] = max(  dp[i-1][j] , dp[i][j-1] , dp[i+1][j] , dp[i][j+1]) + 1;                                                                                          else                                                                                                                                                                                             dp[i][j] = 1 ;

三、代码编写

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>#define N 7
#define max(a,b) ((a>b)?a:b)//定义四个方向,上、左、下、右
int dir[4][2] ={{-1,0},{0,-1},{1,0},{0,1}};
//保存最大长度
int maxRuslt = 0;
//定义矩阵
int a[N][N]={{INT_MAX,INT_MAX,INT_MAX,INT_MAX,INT_MAX,INT_MAX,INT_MAX},{INT_MAX,1,2,3,4,5,INT_MAX},{INT_MAX,16,17,18,19,6,INT_MAX},{INT_MAX,15,24,25,20,7,INT_MAX},{INT_MAX,14,23,22,21,8,INT_MAX},{INT_MAX,13,12,11,10,9,INT_MAX},{INT_MAX,INT_MAX,INT_MAX,INT_MAX,INT_MAX,INT_MAX,INT_MAX}};
//定义dp
int dp[N][N] = {0};int dfs(int i,int j){//递归出口if((a[i][j] < a[i-1][j]) && (a[i][j] < a[i][j-1]) && (a[i][j] < a[i+1][j]) && (a[i][j] < a[i][j+1])){return dp[i][j] = 1;}//已经算出来则不需再计算(备忘录)else if(dp[i][j] > 0){return dp[i][j];}else{int k ;int count = 0;int temp = 0;for(k=0 ; k < 4 ;k++){if(a[i][j] > (a[i + dir[k][0]][j + dir[k][1]])){//继续递归temp = dfs(i + dir[k][0],j + dir[k][1]) + 1;count = max(count,temp);dp[i][j] = count;//最大值保存在全局变量maxRuslt = max(maxRuslt,count);//printf("temp = %d;count = %d;maxResult = %d;\n",temp,count,maxRuslt);}}return count;}
}int main()
{int i,j;for(i =1 ; i < N-1 ; i++){for(j =  1 ; j < N-1 ; j++){dfs(i,j);}}printf("%d",maxRuslt);return 0;
}

四、运行结果

动态规划经典题目——滑雪问题(递归+记忆化搜索)相关推荐

  1. POJ1088 Bailian1088 滑雪【DFS+记忆化搜索】

    滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 114685 Accepted: 43807 Description Mic ...

  2. POJ1088 滑雪 dp入门 记忆化搜索

    题意:给你一个r*c的矩阵,只能从图上数字大的地方滑向数字小的地方,问你一次性最多滑过多少个数字. 思路:记忆化搜索.顺序搜索,记录地图上每一个点出发所能达到的最远长度,若某一点标记过说明当前点的最远 ...

  3. 山东省第五届省赛题C Colorful Cupcakes(五维数组+记忆化搜索)

    在写题目之前先来介绍一下记忆化搜索. 算法上依然是搜索的流程,但是搜索到的一些解用动态规划那种思想和模式保存.一般来说,动态规划总要遍历所有的状态,而搜索可以排除一些无效的状态.最最最最最主要的是,搜 ...

  4. 最大乘积(记忆化搜索)

    题目描述 给一段数列,用k个乘号分开,求所得最大值 n<10! 解析 这样就不用写高精啦 枚举第一个乘号的位置递归记忆化搜索即可 问题! 一开始边界条件写了一个这个: if(n-st<k) ...

  5. UVA10285 Longest Run on a Snowboard【DFS+记忆化搜索】

    Michael likes snowboarding. That's not very surprising, since snowboarding is really great. The bad ...

  6. 记忆化搜索(DFS+DP) URAL 1223 Chernobyl’ Eagle on a Roof

    题目传送门 1 /* 2 记忆化搜索(DFS+DP):dp[x][y] 表示x个蛋,在y楼扔后所需要的实验次数 3 ans = min (ans, max (dp[x][y-i], dp[x-1][i ...

  7. NYOJ 304 节能【记忆化搜索】

    节能 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 Dr.Kong设计的机器人卡多越来越聪明.最近市政公司交给卡多一项任务,每天早晨5:00开始,它负责关掉ZK大道右侧 ...

  8. 递归 dfs 记忆化搜索 动态规划

    今天做洛谷P1434 [SHOI2002]滑雪 的时候仔细想了想记忆化搜索 现在总结一下 为了描述问题的某一状态,必须用到该状态的上一状态,而描述上一状态,又必须用到上一状态的上一状态--这种用自已来 ...

  9. 经典算法——数字三角形的三种解题方法:递推、记忆化搜索、动态规划

    上题目链接: http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/1730.html  递推方法: i ...

最新文章

  1. [PHP] debug_backtrace()可以获取到代码的调用路径追踪
  2. python pandas inplace用法
  3. MySQL 查询统计 日期查询
  4. Ubuntu下安装node和npm
  5. WireShark过滤器选项
  6. IDEA 上位?不!Eclipse Theia 1.0 发布!
  7. 作者:钱卫宁(1976-),男,华东师范大学数据科学与工程研究院教授、博士生导师...
  8. mysql sqlsugar_【开源框架】SqlSugarRepository 全库ORM 正式发布
  9. mysql 5.7 enum_MYSQL中 ENUM 类型的详细解释
  10. GCC的缺陷,由匿名对象引起的内存泄漏
  11. MFC中Doc,View,MainFrmae,App各指针的互相获取
  12. 北风网厉风行Java设计模式视频观后总结
  13. 智慧小区智能物业管理系统综合解决方案
  14. CDOJ 796 DAGE(Big Brother)
  15. Lcd ST7789S寄存器初始化配置
  16. Excel MATCH函数判断两列包含关系
  17. request.setAttribute的用法
  18. 理解滑动平均(exponential moving average)
  19. 修改Android“长按”的反应时间
  20. ESG评级:Ecovadis

热门文章

  1. 如何在Android平台实现低延迟的RTMP/RTSP录屏直播
  2. 汽车 配件 html 特效,html5 echarts汽车仪表盘图表动画特效
  3. 【成功解决】实现Ubuntu20,04 与Windows之间的复制粘贴
  4. 【Python】计算圆度
  5. 计算机组成原理学习笔记第4章 4.12——虚拟存储器
  6. 2019 认知改变与提升
  7. 朝作猛虎行,暮作猛虎吟。C和C++的区别和联系
  8. 连接数据库出错:java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/
  9. C# url 解码 编码
  10. Matlab简单教程:循环