迷宫 — — 蓝桥杯(动态规划)

迷宫

题目:

请添加图片描述

输入样例:

3 1 1
1 2 3
4 5 6
7 8 9
2 2 1
3 1 R

输出样例:

21

请添加图片描述

思路:

题目大意:给定一个n x m的平面网格,并且每一个格子都有一定的代价,并且设有障碍物和陷阱,障碍物的意思是会在原来对应格子的基础上在加上一定的代价,陷阱的意思是如果移动到某一位置有陷阱存在,那么会自动在向右或下移动两个格子。要求从(0, 0)位置开始进行移动,移动到(n, m)结束,每次移动只能选择向下或者向右移动。求移动到终点时最小的代价是什么。

看到题目的数据范围 0 < n,m < 1001就知道,这道题不能使用纯暴力的方法进行求解n * m大概在 1 0 6 10^6 106左右,如果时间复杂度在 O ( N 2 ) O(N^2) O(N2)或者 O ( N log ⁡ N ) O(N\log N) O(NlogN)就可能过不了全部数据。

这道题与力扣上的不同路径II问题十分相似,只是不同路径II问题求的是有多少不同路径的可能性,这道题是求最小的代价是什么,另一点不同的是这道题设定的障碍物与陷阱,而不同路径问题仅仅只设定了障碍物,并且要求有障碍物的位置不能通过(友情链接:不同路径 II

整体思路:使用动态规划的思想,在处理输入数据的时候,将障碍物的部分的代价直接累加到原数组上去,并且开辟一个新的字符数组,用来记录那个地方有陷阱。

初始化边界:

dp[0][0]初始化为第一个格子的代价,然后第一行其它位置的dp值等于前一个位置的dp值加上该位置的代价值,第一列其它位置的dp值等于上面一个位置的dp值加上当前位置的代价值。

代码如下:

for(int i = 1;i <= n;i ++) dp[i][1] = dp[i - 1][1] + nums[i][1];
for(int j = 1;j <= m;j ++) dp[1][j] = dp[1][j - 1] + nums[1][j];

递推公式:

由于每一个位置都可能由其上面的一个位置或者左面的一个位置移动而来,因此dp的值可以初定为(前面一个位置的dp值与上面一个位置的dp值的最小值)+ 当前位置的代价。

代码如下:

dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + nums[i][j];

又因为有陷阱的存在,所以能够道达该位置的可能还有从上面两个位置移动而来,或者从前面两个位置移动而来,因此需要进行额外考虑。

如果存在从上面移动而来的可能,那么就在当前dp值的基础上进行判断,取当前位置上的dp值与(上面两格位置的dp值 +上面一格位置的代价值 + 当前位置的代价值)的最小值,即为当前位置的最小值。因为我们首先判断了正常情况时该位置的dp值,由于存在特殊情况,我们需要取正常情况与特殊情况的最小值来作为当前位置的dp值。

同理,如果当前位置存在从左边两个位置到来的可能,与上面两个位置到来的情况类似。

注意:题目说明不可能一个位置存在两种陷阱的可能。

代码如下:

dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + nums[i][j];
// 判断特殊情况
if(i > 2 &&cnt[i - 2][j] == 'D'){  // 表示从上边过来的 dp[i][j] = min(dp[i][j], dp[i - 2][j] + nums[i - 1][j]+ nums[i][j]) ;
}else if(j > 2  && cnt[i][j - 2] == 'R'){  // 表示从左边过来的dp[i][j] = min(dp[i][j], dp[i][j - 2] + nums[i][j - 1] + nums[i][j]);

代码:

// 迷宫——动态规划版本
#include<bits/stdc++.h>
using namespace std;void solve(){int n, m, k, p;cin>>n>>m>>k>>p;   // k个格子中设置了障碍物, p个陷阱vector<vector<int>> nums(n + 10, vector<int>(m + 1, 0));vector<vector<char>> cnt(n + 10, vector<char>(m + 1, '0'));   // 用于记录 for(int i = 1;i <= n;i ++){for(int j = 1;j <= m;j ++){cin>>nums[i][j];}}while(k--){  // 设置k个障碍物   直接在原有的成本上进行添加成本即可 int _x, _y, c;cin>>_x>>_y>>c;nums[_x][_y] += c;}while(p--){  // 设置p个陷阱 int _x, _y;char c;cin>>_x>>_y>>c;cnt[_x][_y] = c;    // 如果是D:向下移动两个格子,如果是R:向右移动两个格子 }// 动态规划const int inf = 0x3f3f3f3f;vector<vector<int>> dp(n + 10, vector<int>(m + 10, 0));// 初始化边界for(int i = 1;i <= n;i ++) dp[i][1] = dp[i - 1][1] + nums[i][1];for(int j = 1;j <= m;j ++) dp[1][j] = dp[1][j - 1] + nums[1][j];
//	dp[1][1] = nums[1][1];for(int i = 2;i <= n;i ++){for(int j = 2;j <= m;j ++){
//			if(i == 1 && j == 1)continue;dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + nums[i][j];// 判断特殊情况if(i > 2 &&cnt[i - 2][j] == 'D'){  // 表示从上边过来的 dp[i][j] = min(dp[i][j], dp[i - 2][j] + nums[i - 1][j]+ nums[i][j]) ;}else if(j > 2  && cnt[i][j - 2] == 'R'){  // 表示从左边过来的dp[i][j] = min(dp[i][j], dp[i][j - 2] + nums[i][j - 1] + nums[i][j]);}}}cout<<dp[n][m]<<endl;return ;
}int main(){ios::sync_with_stdio(0) ;cin.tie(0);int t = 1;while(t--){solve();}return 0;
} 

请添加图片描述

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

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

相关文章

c++的友元函数,详细笔记,细说三种友元用法

解释友元 友元用通俗易懂的话来说&#xff0c;就是&#xff1a;当有人来到你家里&#xff0c;他就只能呆在客厅里面&#xff0c;你是不可能让他来到你的卧室之中的。但是如果这个人是你的朋友&#xff0c;那么你是默许他可以进入你的卧室的。 此时呢&#xff1f;我告诉你&…

网络IO模型以及实际应用

网络IO模型 本文主要介绍了几种不同的网络IO模型&#xff0c;以及实际应用中使用到的Reactor模型等。 我们常说的网络IO模型&#xff0c;主要包含阻塞IO、非阻塞IO、多路复用IO、信号驱动IO、异步IO。 根据第一个阶段&#xff1a;是否需要阻塞&#xff0c;分为阻塞和非阻塞IO。…

【从浅学到熟知Linux】进程状态与进程优先级(含进程R/S/T/t/D/X/Z状态介绍、僵尸进程、孤儿进程、使用top及renice调整进程优先级)

&#x1f3e0;关于专栏&#xff1a;Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程及数据库等内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 进程状态进程状态查看R运行状态&#xff08;running&#xff09;S睡眠状态&#xff08;sleeping&a…

GT收发器64B66B协议(2)自定义PHY设计

文章目录 前言一、设计框图二、GT_module三、PHY_module3.1、PHY_tx模块3.2、PHY_rx_bitsync模块3.3、PHY_rx模块 四、上板测试总结 前言 有了对64B66B协议的认识以及我们之前设计8B10B自定义PHY的经验&#xff0c;本文开始对64B66B自定义PHY的设计 一、设计框图 二、GT_modu…

Harmony鸿蒙南向驱动开发-UART

UART指异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;&#xff0c;是通用串行数据总线&#xff0c;用于异步通信。该总线双向通信&#xff0c;可以实现全双工传输。 两个UART设备的连接示意图如下&#xff0c;UART与其他模块一般用2线&a…

数据结构初阶:栈和队列

栈 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。 栈中的数据元素遵守后进先出 LIFO &#xff08; Last In First Out &#xff09;的原则。…

为什么每个人都需要了解这些数据加密技术?

在数字时代&#xff0c;数据加密技术不仅对保护企业的商业秘密至关重要&#xff0c;也是个人隐私安全的重要屏障。随着技术的进步和网络犯罪的增加&#xff0c;数据加密已经成为了信息安全领域的一个热点议题。以下是探讨为什么每个人都需要了解这些数据加密技术的几个主要原因…

SpringBoot启动时banner设置

SpringBoot启动时banner设置 1.操作步骤2.各种banner图像 1.操作步骤 在application.properties文件中设置新的banner对于的文件位置&#xff0c;最好放在resources目录下 spring.banner.locationbanner.txt2.各种banner图像 &#xff08;1&#xff09;经典大佛图 具体txt文…

[通俗易懂]《动手学强化学习》学习笔记2-第2、3、4章

文章目录 前言小总结&#xff08;前文回顾&#xff09;第二章 多臂老虎机2.2.2形式化描述 第三章 马尔可夫决策过程3.6 占用度量 代码3.6 占用度量 定理2 第四章 动态规划算法4.3.3 策略迭代算法 代码 总结 前言 参考&#xff1a; 《动手学强化学习》作者&#xff1a;张伟楠&a…

为什么要部署IP SSL证书?怎么申请?

我们需要知道什么是IP SSL证书。SSL&#xff0c;全称为Secure Sockets Layer&#xff0c;即安全套接层&#xff0c;是为网络通信提供安全及数据完整性的一种安全协议。而IP SSL证书就是基于SSL协议的一种证书&#xff0c;它能够为网站和用户的数据传输提供加密处理&#xff0c;…

Prometheus-Grafana基础篇安装绘图

首先Prometheus安装 1、下载 https://prometheus.io/download/ 官网路径可以去这儿下载 2、如图&#xff1a; 3.解压&#xff1a; tar -xf prometheus-2.6.1.linux-amd64 cd prometheus-2.6.1.linux-amd64 4.配置文件说明&#xff1a; vim prometheus.yml 5.启动Promethe…

OpenHarmony NAPI 框架生成工具实现流程

NAPI 框架生成工具 可以根据用户指定路径下的 ts(typescript)接口文件一键生成 NAPI 框架代码、业务代码框架、GN 文件等。在开发 JS 应用与 NAPI 间接口时&#xff0c;底层框架开发者无需关注 Nodejs 语法、C 与 JS 之间的数据类型转换等上层应用转换逻辑&#xff0c;只关注底…

论文| Convolutional Neural Network-based Place Recognition - 2014

2014-Convolutional Neural Network-based Place Recognition

Qt plugin 开发UI界面插件

目录 1.创建接口 2.创建插件 3.创建插件界面 4.插件实现 5.创建应用工程 6.应用插件 1.创建接口 打开QtCreater&#xff0c;点击左上角“文件”->新建文件或项目&#xff0c;在弹窗中选择C/CHeader File。 输入文件名&#xff0c;选好路径&#xff08;可自行设置名称…

Golang | Leetcode Golang题解之第16题最接近的三数之和

题目&#xff1a; 题解&#xff1a; func threeSumClosest(nums []int, target int) int {sort.Ints(nums)var (n len(nums)best math.MaxInt32)// 根据差值的绝对值来更新答案update : func(cur int) {if abs(cur - target) < abs(best - target) {best cur}}// 枚举 a…

BM96 主持人调度(二)(贪心算法)

一开始写的时候忘了给start、end数组赋值了 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** 计算成功举办活动需要多少名主持人* param n int整型 有n个活动* param start…

Qt——示波器/图表 QCustomPlot

一、介绍 QCustomPlot是一个用于绘图和数据可视化的Qt C小部件。它没有进一步的依赖关系&#xff0c;提供友好的文档帮助。这个绘图库专注于制作好看的&#xff0c;出版质量的2D绘图&#xff0c;图形和图表&#xff0c;以及为实时可视化应用程序提供高性能。QCustomPlot可以导出…

解决 VSCode 编辑器点击【在集成终端中打开】出现新的弹框

1、问题描述 在 VSCode 的项目下&#xff0c;鼠标右键&#xff0c;点击【在集成终端中打开】&#xff0c;出现新的一个弹框。新版的 VSCode 会有这个问题&#xff0c;一般来说我们都希望终端是在 VSCode 的控制台中打开的&#xff0c;那么如何关闭这个弹框呢&#xff1f; 2、解…

浅谈一下数据接口怎么方便我们的工作

最近一段时间&#xff0c;一直在折腾自己工作上面的一些事情&#xff0c;这几天终于稍微闲下来去做一份表格。 这份表格是基于一款游戏的数据接口去做一个动态的运算&#xff0c;核算出相关的利润率等等的数据。那么我们今天来具体聊聊Excel的获取数据功能。 现在比较多应用都…

VUE3和SpringBoot实现ChatGPT页面打字效果SSE流式数据展示

在做这个功能之前&#xff0c;本人也是走了很多弯路&#xff08;花了好几天才搞好&#xff09;&#xff0c;你能看到本篇博文&#xff0c;那你就是找对地方了。百度上很多都是使用SseEmitter这种方式&#xff0c;这种方式使用的是websocket&#xff0c;使用这种方式就搞复杂了&…