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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/719380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java---文件,流✨❤️

文章目录 1.遍历文件夹2.遍历子文件夹3.练习流4.以字节流的形式读取文件内容5.以字节流的形式向文件写入数据顶折纠问6 .写入数据到文件 1.遍历文件夹 一般说来操作系统都会安装在C盘&#xff0c;所以会有一个 C:\WINDOWS目录。 遍历这个目录下所有的文件(不用遍历子目录) 找出…

ssh连接ubantu失败

新系统Ubuntu20.4 安装ssh server 1. 安装 openssh-server2. 开启22号端口 # 安装ssh服务 sudo apt-get install openssh-server # 安装防火墙 sudo apt-get install ufw # 开启防火墙 sudo ufw enable #放开22端口 sudo ufw allow 22 开启22号端口 倘若ubuntu没有开启22…

HTTP/2、HTTP/3分别解决了什么问题

总的来说就是HTTP/1.1是请求-响应模型导致队头阻塞问题&#xff0c;HTTP2是TCP层面导致队头阻塞问题 HTTP/2 多路复用&#xff0c;解决了HTTP/1.1队头阻塞问题 HTTP/1.1 的实现是基于请求-响应模型的。同一个连接中&#xff0c;HTTP 完成一个事务&#xff08;请求与响应&…

3.4作业

课上代码复习&#xff1a; 广播接收端代码: #include<myhead.h> int main(int argc, const char *argv[]) {//创建套接字int rfd socket(AF_INET,SOCK_DGRAM,0);if(rfd -1){perror("socket error");return -1;}printf("rfd %d\n",rfd);//填充地…

台式电脑电源各线的电压和电流输出和输出电流

台式电脑电源是电脑硬件的重要组成部分。 它为计算机的各个部件提供所需的电压和电流。 不同的硬件设备和组件有不同的电压和电流输出。 下面详细介绍台式电脑电源各线的电压&#xff0c;包括3.3V、5V、12V、-12V、-5V和5VSB&#xff0c;以及它们的输出电流和用途。 3.3V&#…

【AI+CAD】(一)ezdxf 解析DXF文件

DXF文件格式理解 DXF文件格式是矢量图形文件格式&#xff0c;其详细说明了如何表示不同的图形元素。 DXF是一个矢量图形文件&#xff0c;它捕获CAD图形的所有元素&#xff0c;例如文本&#xff0c;线条和形状。更重要的是&#xff0c;DXF是用于在CAD应用程序之间传输数据的图形…

STM32自学☞I2C

这里只是大体介绍&#xff0c;具体的可参考STM32数据手册

数据结构与算法-选择排序

引言 在计算机科学中&#xff0c;数据结构和算法是两个至关重要的基石。它们共同决定了程序的效率、可读性和可维护性。本文我们将聚焦于一种基础而直观的排序算法——选择排序&#xff0c;并探讨其内在的工作机制以及在实际应用中的优缺点。 一、什么是选择排序&#xff1f; …

Leetcode 3067. Count Pairs of Connectable Servers in a Weighted Tree Network

Leetcode 3067. Count Pairs of Connectable Servers in a Weighted Tree Network 1. 解题思路2. 代码实现 题目链接&#xff1a;3067. Count Pairs of Connectable Servers in a Weighted Tree Network 1. 解题思路 这一题没想到什么好的方法&#xff0c;走的是暴力求解的路…

xss.haozi.me:0x07

<img src1 onerroralert(1)

Spring MVC ThemeResolver原理解析

在Spring MVC框架中&#xff0c;ThemeResolver&#xff08;主题解析器&#xff09;是一个重要但经常被忽视的组件。它负责解析和管理Web应用程序中的主题设置&#xff0c;允许用户根据不同的需求和偏好切换界面主题。ThemeResolver为开发者提供了一种灵活的方式来控制应用程序的…

tomcat下载安装配置教程

tomcat下载安装配置教程 我是使用tomcat下载安装及配置教程_tomcat安装-CSDN博客 此贴来进行安装配置&#xff0c;原文21年已经有些许不同。 下载tomcat 官网&#xff1a;http://tomcat.apache.org/ 我们老师让安装8.5以上&#xff0c;所以我直接选择版本9 点击9页面之后…

DPDK常用API合集三

librte_timer 此库为 DPDK 执行单元提供定时器服务&#xff0c;提供异步执行函数的能力。它可以是周期性的函数调用&#xff0c;也可以是一次性调用。它使用环境抽象层&#xff08;EAL&#xff09;提供的定时器接口获取精确的时间参考&#xff0c;并可以根据需要以每个核心为基…

2024.03.03蓝桥云课笔记——排序

sort简介 #include<algorithm> 使用的是快速排序 时间复杂度为O(nlogn) sort使用(默认是从小到大) 1.sort(起始地址&#xff0c;结束地址的下一位&#xff0c;*比较函数&#xff09;&#xff1b; #include<iostream> #include<algorithm> using namesp…

HTTPS的实现原理

图片来源&#xff1a;HTTPS 详解一&#xff1a;附带最精美详尽的 HTTPS 原理图 - 个人文章 - SegmentFault 思否 加密流程按图中的序号分为&#xff1a; 客户端请求 HTTPS 网址&#xff0c;然后连接到 server 的 443 端口 (HTTPS 默认端口&#xff0c;类似于 HTTP 的80端口)。…

Windows批处理:bat文件学习

目录 第一章、快速了解Windows批处理1.1&#xff09;Windows批处理相关概念介绍1.1.1&#xff09;批处理的起源1.1.2&#xff09;bat文件介绍 1.2&#xff09;Demo1.2.1&#xff09;创建文件添加命令1.2.2&#xff09;bat脚本中的命令解释 第二章、实例2.1&#xff09;点击bat文…

navicat安装11.3

一、安装navicat 1、下载navicat 2、解压压缩包 3、点击exe文件 4、输入密钥&#xff1a; NAVH-WK6A-DMVK-DKW3 5、点击打开&#xff1a; 输入连接参数&#xff1a; 6、查看连接好仓库 7、 在使用navicat来编写sql语句 8、编写语句 连接不上问题&#xff0c;检查问题&#…

[出错]-RuntimeError: “slow_conv_transpose2d_out_cpu“ not implemented for ‘Byte‘

一开始我一直一维是torch版本的问题 输入是用cv2读出来的&#xff0c;数据类型dtype是默认是unit8&#xff0c;输入到模型中&#xff0c;除了要将他转为tenso以外&#xff0c;还要.float将数据类型转为浮点数。

【Vue3】深入理解Vue中的ref属性

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

Redis 之三:Redis 的发布订阅(pub/sub)

概念介绍 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff0c;它允许客户端之间进行异步的消息传递 Redis 客户端可以订阅任意数量的频道。 模型中的角色 在该模型中&#xff0c;有三种角色&#xff1a; 发布者&#xff08;Publisher&#xff09;&#xff1a;负责发送信…