蓝桥杯算法双周赛心得——迷宫逃脱(dp)

大家好,我是晴天学长,dp版的来啦,可以是受益匪浅啊,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪


1) .迷宫逃脱

在这里插入图片描述

迷官逃脱[算法赛]
问题描述
在数学王国中,存在- -个大小为N x M的神秘迷言。第i行第j个位置坐标为(i,j),每个位置(i;,j) (1≤i≤N,1≤j≤M)都对应着一个正整数Aij。迷宫的左上角坐标为(1,1), 右下角坐标为(N,M)。
小蓝初始位于坐标(1,1),并携带著Q把密匙。他的目标是移动到迷言的终点,即坐标(N, M)处。但是通往迷宫尽头的道路并不是一-帆风顺的, 在前进的过程中,他遇到了一些奇特的规则。

规则如下:

1.小蓝每次只能向右移动一个位置或向下移动一个位置。
2.当小蓝所在位置的数和下一步移动位置的数互质时,会有一扇封闭的铁门, 小蓝需要消耗-把密匙来打开铁门,打开铁门后,这把钥匙将被摧毁。如果没有密匙,小蓝将无法移动到该位置。
你需要输出小蓝从起点到终点路径之和的最大值,如果无法从起点到达终点,输出-1

输入格式

第一行输入包含3个整数N, M, Q,分别为迷言的大小和密匙的数量。
接下来输入N行,每行M个整数,为迷言上的数值。

输出格式

输出仅一-行,包含-个整数,表示管案。
样例输入

331
139
样例输出

28


2) .算法思路

迷宫逃脱(DP版)
1.用快读快输接收数据。
2.建立矩阵
3.打表,建立一个三维的dp表。
4.状态转移方程
1.从上面来
int floor=
2.从左面来
int right=
3.状态转移方程
dp[i][j][k] = Math.,max();

4.输出dp[n][m][k](带循环)。


3).算法步骤

1.读取输入的N、M和Q的值(迷宫的尺寸和最大钥匙数量)。
2.创建一个名为"grid"的二维网格数组,用于存储迷宫中每个单元格的值。
3.初始化动态规划数组"dp",其维度为[1100][1100][4],用于存储不同钥匙数量下每个位置的最大分数。
4.读取迷宫中每个单元格的值,并将其存储在"grid"数组中。
5.在"dp"数组中设置起始位置(1, 1)的初始值。因为它是起始位置,所以分数等于该单元格的值。
6.开始动态规划过程,遍历迷宫中的每个单元格。

  1. 对于每个单元格,遍历钥匙数量(从0到Q),计算在给定钥匙数量下到达该单元格的最大分数。
  2. 检查是否可以从上方的单元格移动到当前单元格(即(i-1, j))或从左侧的单元格移动到当前单元格(即(i, j-1))。
  3. 如果可以从上方单元格移动,根据上方单元格的分数和当前单元格的值更新当前单元格的最大分数。
  4. 如果可以从左侧单元格移动,根据左侧单元格的分数和当前单元格的值更新当前单元格的最大分数。
  5. 重复步骤6到步骤10,遍历迷宫中的所有单元格。

7.找到最后一行和最后一列的单元格中不同钥匙数量下的最大分数。
8.将最大分数作为结果进行打印输出。如果最大分数小于或等于0,则输出-1。
9.刷新输出。


4). 代码实例

package LanQiaoTest.动态规划;import jdk.swing.interop.SwingInterOpUtils;import java.io.*;public class 迷宫逃脱_DP {static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));static long dp[][][] = new long[1100][1100][4];static String[] lines;public static void main(String[] args) throws IOException {lines = in.readLine().split(" ");int N = Integer.parseInt(lines[0]);int M = Integer.parseInt(lines[1]);int Q = Integer.parseInt(lines[2]);long[][] grid = new long[N + 10][M + 10];// 接收数据for (int i = 1; i <= N; i++) {lines = in.readLine().split(" ");for (int j = 1; j <= M; j++) {grid[i][j] = Integer.parseInt(lines[j - 1]);}}//起点赋初值(因为起点没有上一个的状态,自己就是自己)for (int i = 0; i <= Q; i++) {dp[1][1][i] = grid[1][1];}//开始打表for (int i = 1; i <= N; i++) {for (int j = 1; j <= M; j++) {for (int k = 0; k <= Q; k++) {int floor = gcd((int) grid[i][j], (int) grid[i][j - 1]) == 1 ? 1 : 0;int left = gcd((int) grid[i][j], (int) grid[i - 1][j]) == 1 ? 1 : 0;//注意钥匙不能超了//上面来//是质数,必须有钥匙。if (k - floor >= 0 && dp[i][j - 1][k - floor] != 0) {dp[i][j][k] = Math.max(dp[i][j][k], dp[i][j - 1][k - floor] + grid[i][j]);}//左面来,注意更新最大值if (k - left >= 0 && dp[i - 1][j][k - left] != 0) {dp[i][j][k] = Math.max(dp[i][j][k], dp[i - 1][j][k - left] + grid[i][j]);}}}}//找到终点的最大值long result = 0;for (int i = 0; i <= Q; i++) {result = Math.max(result, dp[N][M][i]);}out.println(result <= 0 ? -1 : result);out.flush();}private static int gcd(int a, int b) {return b == 0 ? a : gcd(b, a % b);}}

4).总结

  • 越界的地方不能算进去,不然不可达到的地方也会加入答案中。

试题链接:

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

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

相关文章

【办公常识_1】写好的代码如何上传?使用svn commit

首先找到对应的目录 找到文件之后点击SVN Commit

STM32——外部中断

文章目录 0.中断关系映射1.使能 IO 口时钟&#xff0c;初始化 IO 口为输入2.设置 IO 口模式&#xff0c;触发条件&#xff0c;开启 SYSCFG 时钟&#xff0c;设置 IO 口与中断线的映射关系。3.配置NVIC优先级管理&#xff0c;并使能中断4.编写中断服务函数。5.编写中断处理回调函…

浅析智慧社区建设趋势及AI大数据监管平台方案设计

一、背景与需求 伴随着社会与经济的发展&#xff0c;人们对生活质量的要求越来越高&#xff0c;与此同时&#xff0c;新兴技术的进步也促进了智慧社区市场的逐步成熟。智慧社区是社区管理的一种新理念&#xff0c;是新形势下城市与社会管理的一种创新模式。 在上海、杭州、深…

ELK架构

经典的ELK 经典的ELK主要是由Filebeat Logstash Elasticsearch Kibana组成&#xff0c;如下图&#xff1a;&#xff08;早期的ELK只有Logstash Elasticsearch Kibana&#xff09; 此架构主要适用于数据量小的开发环境&#xff0c;存在数据丢失的危险。 整合消息队列Ngin…

数字化背景下,集流体行业的智能制造方法论

行业背景 随着全球对清洁能源需求的不断增加&#xff0c;新能源领域正在迅速崛起&#xff0c;在新能源技术中&#xff0c;锂电池作为一种高效、轻便的能量储存解决方案&#xff0c;正成为主流。而锂电集流体作为锂电池的核心部件&#xff0c;承担着电池内部电流分布的关键角色…

催单开发信怎么写?外贸人如何写催单邮件?

年末催单开发信编写技巧&#xff1f;最有效的催单话术有哪些&#xff1f; 催单开发信成为了企业间日常沟通的重要一环。这些信件不仅有助于促进业务发展&#xff0c;还可加强供应链的协调&#xff0c;确保货物及时送达。蜂邮EDM将介绍如何写一封出色的催单开发信&#xff0c;以…

WorkPlus解放企业应用开发,实现跨平台无缝切换

在移动应用的快速发展时代&#xff0c;企业对于自主开发和应用平台替换的需求日益增长。WorkPlus作为一个完整的移动数字化APP底座&#xff0c;为企业提供了独立自主的应用开发环境&#xff0c;实现了平台无关性和应用解耦。今天&#xff0c;我们将深入探讨WorkPlus在企业应用开…

【攻防世界-misc】pure_color

1.方法一&#xff1a;用画图工具打开图片&#xff0c;将图片拷贝至虚拟机win7桌面&#xff0c; 点“属性”&#xff0c;颜色设置为“黑白”&#xff0c; 出现flag值。 2.方法二&#xff1a;使用Stegsilve打开&#xff0c;分析图片 将图片打开&#xff0c;按左右键查找&#xff…

SVD 最小二乘法解 亲测ok!

线性最小二乘问题 m个方程求解n个未知数&#xff0c;有三种情况&#xff1a; mn且A为非奇异&#xff0c;则有唯一解&#xff0c;xA.inverse()*bm>n&#xff0c;约束的个数大于未知数的个数&#xff0c;称为超定问题&#xff08;overdetermined&#xff09;m<n&#xff0…

【开发实践】使用AES算法加密 .sql文件

一、需求分析 笔者在开发遇到一个小需求&#xff0c;导出数据的sql文件&#xff0c;由于安全监管的需要&#xff0c;对sql文件进行加密处理。实现将sql文件进行加密&#xff0c;最终呈现如下效果&#xff1a; 二、加密文件 1、加密模块 /*** AES加密算法** param sourceFileP…

飞翔的鸟游戏

一.准备工作 首先创建一个新的Java项目命名为“飞翔的鸟”&#xff0c;并在src中创建一个包命名为“com.qiku.bird"&#xff0c;在这个包内分别创建4个类命名为“Bird”、“BirdGame”、“Column”、“Ground”&#xff0c;并向需要的图片素材导入到包内。 二.代码呈现 pa…

VBA经典应用69例:Find方法的应用

《VBA经典应用69例》&#xff08;版权10178981&#xff09;&#xff0c;是我推出的第九套教程&#xff0c;教程是专门针对初级、中级学员在学习VBA过程中可能遇到的案例展开&#xff0c;这套教程案例众多&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以便…