`

用动态规划解--滑雪题 算法分析

阅读更多

问题描述:
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更长。事实上,这是最长的一条。
Input
输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。

Output
输出最长区域的长度。
Sample Input

5 5
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

Sample Output

25
分析及代码实现:

这个问题应该来说是个简单的,很容易想到用动态规划去做的题目。这个问题满足最有子结构
是比较容易看出来。非常容易建立如下递归式:
如果从i,j可以顺着某侧滑的话:
dis_sk[i][j] = max{dis_sk[i-1][j],dis_sk[i][j-1],dis_sk[i+1][j],dis_sk[i][j+1]}+1
那么我们很容易写出递归的:
int dis(int i,int j){
  for(i,j上侧,下侧,左侧,右侧)
      if(该位置没有越界){
         if(顺着该侧可以往下滑)
            如果该侧位置可以滑行的距离(递归调用dis函数)大于dis_sk[i][j],则把dis_sk[i][j]改成该距离+1
      }
}
把这个递归改成动态规划很容易,只要在开始判断一下
if(dis_sk[i][j]) return dis_sk[i][j]; //dis_sk[i][j]开始为0
这样基本上就可以很顺畅的写出代码了:
定义的变量如下:

cpp 代码
  1. int h[101][101];//输入的高度值   
  2. int dis_sk[101][101];//记录了每个点可以滑行的最大距离   
  3. int dx[]={-1,1,0,0};//为了方便上下左右侧的滑行的最大距离而使用的方便数组   
  4. int dy[]={0,0,-1,1};   
  5. int r,c;//输入的行和列  

 一个用来判断是否越界的辅助函数:

cpp 代码
  1. bool in_bound(int i,int j){   
  2.    return i >= 0 && i < r && j >= 0 && j < c;    
  3. }  

下边就是以lookup方式写的动态规划实现的从i,j下滑最大距离:

cpp 代码
  1. int dis(int i,int j){   
  2.     int temp;   
  3.     if(dis_sk[i][j])//如果已经求出来了,直接返回   
  4.         return dis_sk[i][j];   
  5.     for(int k = 0; k < 4; k++){   
  6.         if(in_bound(i+dx[k],j+dy[k])){//如果没有越界   
  7.             if(h[i][j] > h[ i+dx[k] ][ j+dy[k] ]){//如果顺着该侧可以滑   
  8.                temp = dis(i+dx[k],j+dy[k]);//递归求dis(i+dx[k],j+dy[k]),并保存在临时变量temp中   
  9.                dis_sk[i][j] = dis_sk[i][j] > temp ? dis_sk[i][j] : temp + 1;//如果dis_sk[i][j]比temp小,则取temp+1   
  10.             }   
  11.         }   
  12.     }   
  13.     return dis_sk[i][j];   
  14. }  

最后是main函数,取dis(i,j)的最大者就是所求的最长区域的长度:

java 代码
  1. int main(){   
  2.   int max_dis = 0;   
  3.   int temp;   
  4.   int i,j;   
  5.   cin >> r >> c;   
  6.   for(i = 0; i < r; i++)   
  7.       for(j = 0; j < c; j++){   
  8.         cin >> h[i][j];   
  9.         dis_sk[i][j] = 0;   
  10.       }   
  11.   
  12.   for(i = 0; i < r; i++)   
  13.       for(j = 0; j < c; j++){   
  14.           temp = dis(i,j);   
  15.           max_dis = max_dis > temp ? max_dis : temp;   
  16.       }   
  17.   
  18.   cout << max_dis + 1 << endl;   
  19.   return 0;   
  20. }  

 

分享到:
评论

相关推荐

    算法实验(动态规划-12-16题)1

    算法设计与动态规划 动态规划是一种常用的算法设计方法,它可以解决许多复杂的问题。动态规划的基本思想是将问题分解成多...但是,我们需要具备良好的问题分析和解决能力,以及丰富的算法设计经验来解决动态规划问题。

    动态规划算法poj1088滑雪实验报告

    标题中的“动态规划算法poj1088滑雪实验报告”指的是使用动态规划算法解决北京大学ICPC在线测评系统POJ中编号为1088的滑雪问题。这个问题旨在通过一个直观的应用实例,帮助学习者深入理解动态规划的概念,并熟练运用...

    记忆化搜索--动态规划《滑雪》代码

    记忆化搜索--动态规划入门《滑雪》AC代码 自己写

    2024-2030年滑雪手套行业市场调研及前景趋势预测报告.pdf

    中国滑雪手套行业最新发展动态分析 - **智能化趋势**:部分企业开始尝试将智能技术应用于滑雪手套,如集成加热功能或健康监测传感器等。 - **环保材料应用**:越来越多的企业采用可回收或生物降解材料,响应绿色...

    滑雪场管理系统论文-java-滑雪场管理系统文档-论文-文档

    1. **需求分析**:通过对滑雪场日常运营的具体需求进行分析,明确系统的功能目标和技术要求。 2. **概要设计**:在此基础上制定出系统的总体设计方案,包括模块划分、架构选择、技术栈确定等内容。 3. **详细设计**...

    行业-融创中国-1918.HK-见微知著-初探室内滑雪场赛道.rar

    在这个背景下,可能是指通过对室内滑雪场这一细分市场的深入分析,来洞察整个冰雪产业或融创中国的发展前景。 “初探室内滑雪场赛道”意味着我们将讨论的是一个新兴且具有潜力的市场领域——室内滑雪设施。随着冰雪...

    (5.6-2020)滑雪游戏skiing.zip项目unity源码下载

    (5.6-2020)滑雪游戏skiing.zip项目unity源码下载(5.6-2020)滑雪游戏skiing.zip项目unity源码下载 1.适合学生学习研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考

    基于springboot滑雪场管理系统 - java - springboot - 滑雪场管理系统代码 - 网站-代码

    基于springboot滑雪场管理系统 | java | springboot | 滑雪场管理系统代码 | 网站 1、技术栈:springboot,vue,ajax,maven,mysql,MyBatisPlus 2、系统的实现 用户信息 图片素材 视频素材 摘 要 I 目 录 III ...

    动态规划部分题解-c++描述

    在IT领域,动态规划是一种强大的算法,用于解决各种复杂的问题,尤其在优化和搜索问题上表现卓越。这里我们将深入探讨动态规划与C++语言的结合,通过标题和描述中的实例来解析这一领域的关键知识点。 首先,让我们...

    TYVJ题库P1005题 滑雪问题源代码

    综上所述,这个编程问题可能是一个关于路径规划的挑战,要求参赛者通过动态规划和递归算法来寻找滑雪者从起点到终点的最佳路径。具体实现可能涉及构建一个状态空间,并用递归进行深度探索,同时利用动态规划来避免...

    POJ各题算法分类和题目推荐 ACM必看

    * 1088 滑雪:本题目使用动态规划来计算滑雪的最短距离。 * 1125 Stockbroker Grapevine:本题目使用动态规划来计算股票交易的最大收益。 * 1141 Brackets Sequence:本题目使用动态规划来计算括号序列的最长长度。 ...

    2017-2022年滑雪装备行业市场研究及发展前景预测报告.pdf

    2017-2022年滑雪装备行业市场研究及发展前景预测报告.pdf

    中国滑雪行业白皮书-2020年成拐点,滑雪小众“出圈” -Mob.pdf

    - **主要内容**:报告全面分析了中国滑雪行业的现状和发展趋势,重点关注2020年的行业变化及其对未来的影响。 #### 二、核心观点与行业规模 - **市场规模**:至2019年底,中国滑雪产业市场规模接近900亿元人民币。 ...

    算法-滑雪(信息学奥赛一本通-T1280)(包含源程序).rar

    标题中的“滑雪”通常在信息学竞赛中是一个模拟或图论问题,可能涉及到路径规划、最短路径算法或者动态规划等算法。这类问题通常要求参赛者编写程序来解决特定的滑雪场景,比如从山顶到山脚下的最短时间路径、避免...

    社交滑雪驱动算法.zip

    "社交滑雪驱动算法"是一种利用社会网络数据和滑雪运动特性相结合的算法模型,它主要应用于数据分析、用户行为预测以及优化用户体验等领域。在这个压缩包文件中,我们可能找到了关于该算法的详细资料,其中包括一个名...

    Cocos2d-x滑雪游戏源码.zip

    动态生成地图的技术通常涉及算法设计,如分块加载、随机种子等,能够有效降低内存占用,提高游戏性能。 曲线地图的设计是滑雪游戏中的核心要素,它要求开发者具备对物理引擎的深入理解以及对2D图形绘制的熟练掌握。...

    小游戏源码-圣诞节滑雪挑战,速度很快哦,一起来!.rar

    《小游戏源码-圣诞节滑雪挑战》是一款以圣诞为主题的滑雪竞速游戏,其源码提供了丰富的学习和开发资源。本文将详细解析此游戏源码中的关键知识点,帮助读者深入理解游戏编程的基本原理和技术。 首先,我们要知道...

    ACM滑雪问题&解答

    标题中的“ACM滑雪问题&解答”指的是在...总的来说,ACM滑雪问题是一个典型的动态规划问题,它要求参赛者运用递归和记忆化搜索技巧来高效求解。理解和熟练掌握这种算法对于参加ACM竞赛或者提升编程技能都非常重要。

    滑雪场问题

    - **动态规划**:本问题的核心在于利用动态规划的思想,通过递归地计算每个位置的最大路径长度,并将其存储起来,以备后续使用,避免了重复计算。 - **状态定义**:状态定义为当前位置的最大路径长度,状态转移方程...

Global site tag (gtag.js) - Google Analytics