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

迷宫

题目:

请添加图片描述

输入样例:

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;
} 

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

win11 连接海康摄像头 ONVif协议

目录 Win 11 通过脚本打开自带的IE浏览器访问海康摄像头 海康摄像头设置支持onvif协议 安装onvif协议 onvif协议示例代码 Win 11 通过脚本打开自带的IE浏览器访问海康摄像头 第一步、桌面右键新建一个 txt 的文档 第二步、打开文档并且复制粘贴下面代码 CreateObject(&…

【科研】搜索文献的网站

文章目录 paperswithcode【最新论文&#xff0c;代码】huggingface【大语言模型&#xff0c;最新论文】dblp【关键词搜索】arxiv【最新文章】semanticscholar【相关引用查询】connectedpapers【相关引用查询】github【工程&#xff0c;代码&#xff0c;论文开源代码】 paperswi…

OV证书为什么更可信

在网络安全领域&#xff0c;SSL/TLS证书扮演着至关重要的角色&#xff0c;其中组织验证&#xff08;Organization Validation&#xff0c;简称OV&#xff09;证书以其深度验证机制和高度可信性脱颖而出。 OV证书为何更值得信赖&#xff0c;关键在于其严格的验证流程。 首先&am…

金三银四面试题(十九):MySQL中的锁

在MySQL中&#xff0c;锁是非常重要的&#xff0c;特别是在多用户并发访问数据库的环境中&#xff0c;因此也是面试中常问的话题。 请说说数据库的锁&#xff1f; 关于MySQL 的锁机制&#xff0c;可能会问很多问题&#xff0c;不过这也得看面试官在这方面的知识储备。 MySQL …

东方博宜 1169. 编程输入10个正整数,然后自动按从大到小的顺序输出

东方博宜 1169. 编程输入10个正整数&#xff0c;然后自动按从大到小的顺序输出 学了sort函数的新用法。 从小到大排列 sort(a , an ) 从大到小排列 sort(a , an , greater() ) #include<iostream> #include<algorithm> using namespace std; int main() {int a[…

瑞_23种设计模式_访问者模式

文章目录 1 访问者模式&#xff08;Visitor Pattern&#xff09;1.1 介绍1.2 概述1.3 访问者模式的结构1.4 访问者模式的优缺点1.5 访问者模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 拓展——双分派4.1 分派4.2 动态分派&#xff08;多态&am…

新型[datahelper@onionmail.org].datah 勒索病毒来袭:如何筑起安全防线?

在数字化时代&#xff0c;网络安全问题日益凸显&#xff0c;其中勒索病毒成为了一种非常严重的威胁。[datahelperonionmail.org].datah勒索病毒就是其中的佼佼者&#xff0c;它以其复杂的加密手段和恶劣的勒索行为&#xff0c;给用户带来了巨大的损失。本文将从病毒的运行机制、…

systemctl start docker报错(code=exited, status=1/FAILURE)

运行systemctl start docker报错内容如下: 输入systemctl status docker.service显示以下内容&#xff1a; 本次启动不起来与docker服务无关 具体解决问题是修改 /etc/docker/daemon.json&#xff0c;vim /etc/docker/daemon.json # 添加如下内容 {"registry-mirrors&qu…

Win10安装sqlplus遇到报错的解决办法

1.下载安装sqlplus.exe的错误解决过程 最近有用到sqlplus连接Oracle数据库执行自动化脚本&#xff0c;Orcle服务器版本是11.2.0.1。在Navicat工具上通过如下语句查询到的版本信息截图如图1所示&#xff1a; SELECT * FROM v$version; 图1 Oracle服务器版本信息 其中“Oracle Da…

图像分割-RSPrompter

文章目录 前言1. 自动化提示器1.1 多尺度特征增强器1.2 RSPrompterAnchor-based PrompterQuery-based Prompter 2. SAM的扩展3. 结果WHU数据集NWPU数据集SSDD数据集 前言 《RSPrompter: Learning to prompt for remote sensing instance segmentation based on visual foundati…

面试算法-172-对称二叉树

题目 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 解 class Solution {public boolean isSymmetric(TreeNode root) {return isSymm(root.left,root.right);}public b…

Python学习笔记——heapq

堆排序 思路 堆排序思路是&#xff1a; 将数组以二叉树的形式分析&#xff0c;令根节点索引值为0&#xff0c;索引值为index的节点&#xff0c;子节点索引值分别为index*21、index*22&#xff1b;对二叉树进行维护&#xff0c;使得每个非叶子节点的值&#xff0c;都大于或者…

Redis持久化策略详解

文章目录 前言一、RDB(Redis Database)1.1 概念1.2 触发方式 二、AOF(Append Only File)2.1 概念2.2 AOF持久化策略2.3 AOF文件重写2.4 触发条件2.5 AOF配置说明 三、混合持久化3.1 概念3.2 开启混合持久化3.3 加载流程3.4 混合持久化优劣势 四、总结4.1 RDB和AOF各自有什么优缺…

一文带你了解Material, Texture Mapping, Shading, Shader

作者&#xff1a;caven chen 在计算机图形学和三维开发过程中&#xff0c;有几个容易混淆的概念。今天我们来一举拿下。 又可以学习新的知识啦。冲鸭。。。。。。 基础概念 首先我们来介绍一些基础概念: 英文 中文 本质 释义 Material 材质 数据集 表现物体对光的交互…

VirusTaxo:病毒物种注释

https://github.com/omics-lab/VirusTaxo 安装 git clone https://github.com/omics-lab/VirusTaxo mamba create -n VirusTaxo python3.10 mamba activate VirusTaxo cd VirusTaxo python3 -m venv environment source ./environment/bin/activate pip install -r require…

【JavaWeb】Day40.MySQL概述——多表设计(一对多)

多表设计 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种&#xff1a; 一对多(多…

【机器学习算法】决策树和随机森林在计算机视觉中的应用

前言 决策树和随机森林在计算机视觉中有着广泛的应用。决策树作为一种简单而强大的分类模型&#xff0c;可以用于图像分类、目标检测、特征提取等任务。它能够根据图像的特征逐层进行判断和分类&#xff0c;从而实现对图像数据的智能分析和理解。随机森林作为一种集成学习方法&…

Tree-RAG工作流程及实体树应用介绍

引言 T-RAG方法基于将检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;简称RAG&#xff09;架构与开源经过微调的大型语言模型&#xff08;Large Language Model&#xff0c;简称LLM&#xff09;以及实体树向量数据库相结合。这种方法的重点在于上下文检索…

001-NodeJs全局对象

概念 node是一个运行js的平台&#xff0c;在node中&#xff0c;用global对象取代了Window这个对象。 node中的repl环境可以执行js,通过命令node进入到repl环境。repl环境类似于Chrome的开发人员工具。 全局对象global 可以参考一下它的文档global全局对象 node版本介绍&am…

Tecplot导出流场Movie

本人最近想利用Tecplot导出流场计算的视频&#xff0c;找了以下两种方法&#xff1a;1、直接一次性打开所有文件&#xff0c;导出视频&#xff1b;2、利用脚本每次打开一个文件&#xff0c;导出其照片&#xff0c;最后合成视频。 方法一 对于文件内存少的情况&#xff0c;自然…