动态规划经典题目——滑雪问题(递归+记忆化搜索)
一、题目
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更长。事实上,这是最长的一条。
二、解题思路
动态规划解题思路可详见另一篇文章。
- 设二维数组dp[i][j]表示从(i,j)滑到低坡的最大长度。
- 解题技巧:在矩阵周围加入数值为正无穷大数值(INT_MAX);
- 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;
}
四、运行结果
动态规划经典题目——滑雪问题(递归+记忆化搜索)相关推荐
- POJ1088 Bailian1088 滑雪【DFS+记忆化搜索】
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 114685 Accepted: 43807 Description Mic ...
- POJ1088 滑雪 dp入门 记忆化搜索
题意:给你一个r*c的矩阵,只能从图上数字大的地方滑向数字小的地方,问你一次性最多滑过多少个数字. 思路:记忆化搜索.顺序搜索,记录地图上每一个点出发所能达到的最远长度,若某一点标记过说明当前点的最远 ...
- 山东省第五届省赛题C Colorful Cupcakes(五维数组+记忆化搜索)
在写题目之前先来介绍一下记忆化搜索. 算法上依然是搜索的流程,但是搜索到的一些解用动态规划那种思想和模式保存.一般来说,动态规划总要遍历所有的状态,而搜索可以排除一些无效的状态.最最最最最主要的是,搜 ...
- 最大乘积(记忆化搜索)
题目描述 给一段数列,用k个乘号分开,求所得最大值 n<10! 解析 这样就不用写高精啦 枚举第一个乘号的位置递归记忆化搜索即可 问题! 一开始边界条件写了一个这个: if(n-st<k) ...
- UVA10285 Longest Run on a Snowboard【DFS+记忆化搜索】
Michael likes snowboarding. That's not very surprising, since snowboarding is really great. The bad ...
- 记忆化搜索(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 ...
- NYOJ 304 节能【记忆化搜索】
节能 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 Dr.Kong设计的机器人卡多越来越聪明.最近市政公司交给卡多一项任务,每天早晨5:00开始,它负责关掉ZK大道右侧 ...
- 递归 dfs 记忆化搜索 动态规划
今天做洛谷P1434 [SHOI2002]滑雪 的时候仔细想了想记忆化搜索 现在总结一下 为了描述问题的某一状态,必须用到该状态的上一状态,而描述上一状态,又必须用到上一状态的上一状态--这种用自已来 ...
- 经典算法——数字三角形的三种解题方法:递推、记忆化搜索、动态规划
上题目链接: http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/1730.html 递推方法: i ...
最新文章
- [PHP] debug_backtrace()可以获取到代码的调用路径追踪
- python pandas inplace用法
- MySQL 查询统计 日期查询
- Ubuntu下安装node和npm
- WireShark过滤器选项
- IDEA 上位?不!Eclipse Theia 1.0 发布!
- 作者:钱卫宁(1976-),男,华东师范大学数据科学与工程研究院教授、博士生导师...
- mysql sqlsugar_【开源框架】SqlSugarRepository 全库ORM 正式发布
- mysql 5.7 enum_MYSQL中 ENUM 类型的详细解释
- GCC的缺陷,由匿名对象引起的内存泄漏
- MFC中Doc,View,MainFrmae,App各指针的互相获取
- 北风网厉风行Java设计模式视频观后总结
- 智慧小区智能物业管理系统综合解决方案
- CDOJ 796 DAGE(Big Brother)
- Lcd ST7789S寄存器初始化配置
- Excel MATCH函数判断两列包含关系
- request.setAttribute的用法
- 理解滑动平均(exponential moving average)
- 修改Android“长按”的反应时间
- ESG评级:Ecovadis
热门文章
- 如何在Android平台实现低延迟的RTMP/RTSP录屏直播
- 汽车 配件 html 特效,html5 echarts汽车仪表盘图表动画特效
- 【成功解决】实现Ubuntu20,04 与Windows之间的复制粘贴
- 【Python】计算圆度
- 计算机组成原理学习笔记第4章 4.12——虚拟存储器
- 2019 认知改变与提升
- 朝作猛虎行,暮作猛虎吟。C和C++的区别和联系
- 连接数据库出错:java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/
- C# url 解码 编码
- Matlab简单教程:循环