[动态规划,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

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

Java导出Excel动态表头的示例详解

《Java导出Excel动态表头的示例详解》这篇文章主要为大家详细介绍了Java导出Excel动态表头的相关知识,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录前言一、效果展示二、代码实现1.固定头实体类2.动态头实现3.导出动态头前言本文只记录大致思路以及做法,代码不进

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree