[动态规划,DFS深度搜索]滑雪

2024-03-04 21:36

本文主要是介绍[动态规划,DFS深度搜索]滑雪,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

滑雪

题目描述

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更长。事实上,这是最长的一条。

关于输入

输入的第一行表示区域的行数R和列数C(1<=R,C<=500)。下面是R行,每行有C个整数,代表高度h,0<=h<=1000000。

关于输出

输出最长区域的长度。

例子输入
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
例子输出
25
解题分析

起初一看,觉得是一个用DFS深度优先搜索的题无疑了,于是用一个go函数,并遍历每个位置,从每个位置开始搜索,并时刻更新搜索的长度和保留最大值,同时,也合理地存储了当前位置下的长度,并在其他搜索路径经过此处时,判断长度是否要更小,如果更小,说明这是一种无效的情况,可以提前退出减枝操作。于是有了下面的代码:

代码演示1
#include <iostream>
using namespace std;
int R,C,mountains[505][505],res[505][505];
int ans=1,dx[]={-1,1,0,0},dy[]={0,0,-1,1};void go(int x,int y,int step){if(step>ans){ans=step;}if(step<=res[x][y]){return;}for(int i=0;i<4;i++){int nx=dx[i]+x,ny=dy[i]+y;if(nx>=0 && nx<R && ny>=0 && ny<C && mountains[nx][ny]<mountains[x][y]){go(nx,ny,step+1);}}res[x][y]=step;return;
}int main(){scanf("%d%d",&R,&C);for(int i=0;i<R;i++)for(int j=0;j<C;j++){scanf("%d",&mountains[i][j]);}for(int i=0;i<R;i++)for(int j=0;j<C;j++){go(i,j,1);}printf("%d",ans);return 0;
}

首先,本代码在思路以及算法的实现上都不存在问题,总的来说,这是个正确的代码。不过,它有个致命的缺陷,就是在一些特定的情况下递归深度会过大,从而导致栈溢出,programerror!实际上,我们也许根本不用调用那么多栈。

于是来看动态规划的思路:

我们假定dp[i][j]是从(i,j)位置开始寻找所能到达的最大长度,我们可以发现,dp[i][j]=max(dp[x-1][y]+1,dp[x+1][y]+1,dp[x][y-1]+1,dp[x][y+1]+1),于是动态规划的转移方程就出来啦。当前位置所能递推的最大深度,就是它周围格子所能递推的最大深度再+1就可以了。

代码实现
#include <iostream>
using namespace std;
int R,C,mountains[505][505],dp[505][505];
int ans=1,dx[]={-1,1,0,0},dy[]={0,0,-1,1};int go(int x,int y){if(dp[x][y]){return dp[x][y];}int step=1;for(int i=0;i<4;i++){int nx=x+dx[i],ny=y+dy[i];if(nx>=0 && nx<R && ny>=0 && ny<C && mountains[nx][ny]<mountains[x][y]){step=max(step,go(nx,ny)+1);}}return dp[x][y]=step;
}int main(){scanf("%d%d",&R,&C);for(int i=0;i<R;i++)for(int j=0;j<C;j++){scanf("%d",&mountains[i][j]);}for(int i=0;i<R;i++)for(int j=0;j<C;j++){ans=max(ans,go(i,j));}printf("%d",ans);return 0;
}

这篇关于[动态规划,DFS深度搜索]滑雪的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/774514

相关文章

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu

基于Canvas的Html5多时区动态时钟实战代码

《基于Canvas的Html5多时区动态时钟实战代码》:本文主要介绍了如何使用Canvas在HTML5上实现一个多时区动态时钟的web展示,通过Canvas的API,可以绘制出6个不同城市的时钟,并且这些时钟可以动态转动,每个时钟上都会标注出对应的24小时制时间,详细内容请阅读本文,希望能对你有所帮助...

Python使用DeepSeek进行联网搜索功能详解

《Python使用DeepSeek进行联网搜索功能详解》Python作为一种非常流行的编程语言,结合DeepSeek这一高性能的深度学习工具包,可以方便地处理各种深度学习任务,本文将介绍一下如何使用P... 目录一、环境准备与依赖安装二、DeepSeek简介三、联网搜索与数据集准备四、实践示例:图像分类1.