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

news2025/6/27 0:03:13

迷宫

题目:

请添加图片描述

输入样例:

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.coloradmin.cn/o/1584038.html

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

相关文章

图书馆自习室|基于SSM的图书馆自习室座位预约小程序设计与实现(源码+数据库+文档)

图书馆自习室目录 基于SSM的图书馆自习室座位预约小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、小程序端&#xff1a; 2、后台 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a…

专为苹果系统设计的精美可视化图表 | 开源日报 No.219

danielgindi/Charts Stars: 27.3k License: Apache-2.0 Charts 是为 iOS/tvOS/OSX 提供美观图表的开源项目&#xff0c;是跨平台 MPAndroidChart 在苹果设备上的实现。该项目提供了以下主要功能和优势&#xff1a; 支持 iOS、tvOS 和 macOS 平台使用 Swift 编写&#xff0c;可…

14款DevOps/SRE工具,助力提升运维效率

简介 随着平台工程的兴起&#xff0c;DevOps 和 SRE 不断发展&#xff0c;带来了新一代工具&#xff0c;旨在提高软件开发和运维的效率、可扩展性和可靠性。 在本篇文章中&#xff0c;我们将深入探讨一些最具发展前景的工具&#xff0c;它们正在塑造持续集成与部署、监控与可观…

【网站项目】校园二手交易平台小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

STL库 —— list 的编写

目录 一、成员变量 ​编辑 二、push_back 函数 三、迭代器 iterator 3.1 iterator 结构体 3.2 begin() 与 end() 函数 3.3 iterator 运算符重载 3.4 -> 的重载 3.5 const_iterator 四、测试代码 五、修饰符成员 5.1 insert 函数 5.2 erase 函数 5.3 push 函数…

【SQL Server】数据库死锁

在软件使用了SQL Server数据库的场合&#xff0c;运行软件时&#xff0c;出现&#xff1a; "事务(进程 ID **)与另一个进程被死锁在 锁 资源上&#xff0c;并且已被选作死锁牺牲品。请重新运行该事物"。 分析原因&#xff1a;软件多个进程在调用SQL语句访问数据库表的…

计算机网络——WEB服务器编程实验

实验目的 1. 处理一个 http 请求 2. 接收并解析 http 请求 3. 从服务器文件系统中获得被请求的文件 4. 创建一个包括被请求的文件的 http 响应信息 5. 直接发送该信息到客户端 具体内容 一、C 程序来实现 web 服务器功能。 二、用 HTML 语言编写两个 HTML文件&#xff0c;并…

使用阿里云试用Elasticsearch学习:4. 聚合——2

近似聚合 如果所有的数据都在一台机器上&#xff0c;那么生活会容易许多。 CS201 课上教的经典算法就足够应付这些问题。如果所有的数据都在一台机器上&#xff0c;那么也就不需要像 Elasticsearch 这样的分布式软件了。不过一旦我们开始分布式存储数据&#xff0c;就需要小心…

flutter中鼠标检测事件的应用---主要在于网页端使用

flutter中鼠标检测事件的应用—主要在于网页端使用 鼠标放上去 主要代码 import package:flutter/material.dart;class CustomStack extends StatefulWidget {override_CustomStack createState() > _CustomStack(); }class _CustomStack extends State<CustomStack>…

规则引擎之LiteFlow应用

官网地址&#xff1a;LiteFlow DEMO 整体结构 1.引入maven依赖 <dependency><groupId>com.yomahub</groupId><artifactId>liteflow-spring-boot-starter</artifactId><version>2.11.4.2</version> </dependency> 2. 配置yml …

TensorFlow学习之:深度学习基础

神经网络基础 神经网络是深度学习的核心&#xff0c;它们受人脑的结构和功能启发&#xff0c;能够通过学习大量数据来识别模式和解决复杂问题。神经网络的基本工作原理包括前向传播和反向传播两个阶段。 前向传播&#xff08;Forward Propagation&#xff09; 前向传播是神经…

微信小程序制作圆形进度条

微信小程序制作圆形进度条 1. 建立文件夹 选择一个目录建立一个文件夹&#xff0c;比如 mycircle 吧&#xff0c;另外把对应 page 的相关文件都建立出来&#xff0c;包括 js&#xff0c;json&#xff0c;wxml 和 wxcc。 2. 开启元件属性 在 mycircle.json中开启 component 属…

uniapp小程序中使用video视频播放卡顿

问题:在使用uniapp小程序的video视频播放,视频已经在播放了,但是进度条没走,还是卡顿的状态(测试ios能正常使用,安卓手机会出现此问题) 在网上找了很多方法,最多的说是用:custom-cache"false",试了并没有效果,看来和我问题不一样,后来用了个简单粗暴的方法,发现是有效…

docker 创建容器过程

结合下图&#xff0c;本文讨论docker 创建容器过程&#xff1a; START└── [用户通过Docker Client发出指令]└── (1) docker run 或 docker create 命令├── (2) Docker Client与Docker Daemon建立通信连接└── (3) Docker Daemon接收到创建容器请求├── (4) 检查…

密码学基础--搞清RFC和PKCS(1)

目录 1. CryptoDriver里KeyElement格式 2. 挖掘RFC标准 3.小结 昨天从生成密钥对开始逐步了解了公钥、证书等各种编码方式&#xff0c;今天继续趁热打&#xff0c;做一个理论知识汇总。 Ps:我只是标准的翻译搬运工。 1. CryptoDriver里KeyElement格式 在 CryptoKeyElemen…

实现鼠标在页面点击出现焦点及大十字星

近段时间&#xff0c;在完成项目进度情况显示时候&#xff0c;用户在操作鼠标时候&#xff0c;显示当鼠标所在位置对应时间如下图所示 代码实现步骤如下&#xff1a; 1.首先引用 jquery.1.7.js 2.再次引用raphael.js 3.然后引用graphics.js 4.最后引用mfocus.js 其中mfocu…

地理信息系统(ArcGIS)在水文水资源、水环境中的应用

刘老师&#xff08;副教授&#xff09;&#xff1a;来自北京重点高校资深专家&#xff0c;长期从事水资源与水环境、流域污染控制与管理、非点源模拟与控制、环境信息系统开发、环境遥感与GIS应用等领域的研究&#xff0c;发表多篇Sci论文、具有资深的技术底蕴和专业背景。 1、…

多张固定宽度元素,随着屏幕尺寸变化自动换行

背景&#xff1a;多张固定宽度元素&#xff0c;随着屏幕尺寸变化自动换行实现&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevic…

最好的 iPhone 解锁器解决方案功能、优点和缺点

现最受好评的 iPhone 解锁器&#xff0c;例如 奇客解锁、iPassGo 等。深入了解它们的优缺点和兼容性&#xff0c;以做出明智的决定。了解如何解锁 iPhone 并解决有关解锁方法、PIN 绕过和潜在风险的常见问题。 1、奇客手机解锁 奇客手机解锁是一款适用于 iOS 的多功能解锁工具…

Ubuntu-22.04安装VMware虚拟机并安装Windows10

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、VMware是什么&#xff1f;二、安装VMware1.注册VMware账号2.下载虚拟机3.编译vmmon&vmnet4.加载module5.安装bundle 三、安装Windows101.基础配置2.进阶…