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

news2024/9/27 12:15:28

大家好,我是晴天学长,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.coloradmin.cn/o/1243243.html

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

相关文章

24路电磁锁控板的特点和主要参数

智能快递柜、智能生鲜柜、电子存储柜、超市寄存柜、智能送餐柜、电子更衣柜、档案柜等物联网终端设备&#xff0c;都是采用电磁锁控制&#xff0c;这种电磁锁控制板俗称锁控板。锁控板可以远程控制储物柜的开关以及远程监控并提供锁的反馈信号。沐渥开发的24路电磁锁控板可以控…

电脑键盘推荐

一、键盘分类 &#xff08;1&#xff09;键位个数 目前有75&#xff0c;84&#xff0c;87&#xff0c;98&#xff0c;104&#xff0c;108的。 &#xff08;2&#xff09;薄膜键盘和机械键盘 薄膜键盘就是大多数办公室常见的键盘&#xff0c;主要打一个便宜&#xff0c;耐造…

va-Q-tec实现温度敏感产品运输过程质量控制温控无忧

摘要&#xff1a;温度敏感产品运输对供应链全流程的温度质量要求较高&#xff0c;往往需要借助特殊的温湿度监测技术产品。va-Q-tec与虹科Comet合作&#xff0c;采用虹科Comet的U系列温度记录仪&#xff0c;为集装箱运输过程提供完整的温控包装解决方案。 一、客户背景 va-Q-…

跨境电商热点:如何在海外市场打开局面

随着全球化的推进&#xff0c;跨境电商成为连接不同国家和地区的商贸桥梁&#xff0c;呈现出蓬勃的发展势头。在这个竞争激烈的环境中&#xff0c;如何在海外市场打开局面成为跨境电商面临的关键问题。本文将深入探讨跨境电商的热点问题&#xff0c;分析如何有效利用市场趋势和…

AI智能网关如何助力危化品安全监测

安全是一切发展的基石和前提&#xff0c;在工业领域中&#xff0c;部分工业原料具有易燃、易爆、腐蚀、有毒有害等不同的危险特性&#xff0c;对于这些原材料的运输、储存、加工等行为&#xff0c;都需要遵循严格的安全规章制度。 针对危化品的仓储安全监测和管理&#xff0c;可…

Vue3(setup)中使用vue-cropper图片上传裁剪插件,复制代码直接使用

最近在项目中用到上传裁剪&#xff0c;看了一下代码&#xff0c;觉得这插件可可以。梳理了一下代码分享给大家 前端UI组件element-plus 如果你也用到了 &#xff0c;快速帮你解决了问题,别忘记点赞收藏 1.首先看效果图 因为版本vue-cropper 众多 &#xff0c;虽然网上有各…

前端 计算机基础篇 ( 二 )

文章目录 websockt及原理ipv4和ipv6的区别线程和进程的区别cdn原理缓存所涉及的http状态码缓存的时候设置 no-store和no-cache和max-age0这几个有什么区别token一般存放在哪儿怎么设置强缓存和协商缓存强缓存&#xff1a;1. 使用 Cache-Control 头字段&#xff1a; 协商缓存&am…

unordered_map 与 unordered_set 的使用

unordered_map unordered_map 的介绍文档 unordered_map 的介绍文档&#xff1a;来自cpluscplus.com 的中文翻译 unordered_map是存储<key, value>键值对的关联式容器&#xff0c;其允许通过keys快速的索引到与 其对应的value。在unordered_map中&#xff0c;键值通常用…

码云 -- 本地代码上传到码云

1. 在码云上创建远程仓库 复制远程仓库地址 2. 在本地代码上创建 git 仓库 在本地代码文件夹上&#xff0c;打开git 命令窗口 输入初始化命令&#xff0c;创建 git 仓库 git init3. 给 git 仓库添加远程仓库 继续输入 git 命令 git remote add origin 远程仓库地址4. 按 git 的…

数字逻辑电路基础-时序逻辑电路之触发器

文章目录 一、D触发器二、verilog源码三、综合及仿真结果一、D触发器 本文介绍数字逻辑电路中常用的基础时序逻辑电路触发器。它有记忆和存储信息功能,触发器是边沿触发电路。 下图是触发器常用表示方式(时钟上升沿有效): 触发器由两个锁存器组成,前级是主锁存器,后级…

Git工作流和Commit规范

Git大家都非常熟悉了&#xff0c;就不做过多介绍&#xff0c;但是如何用好Git、如何进行合理的分支开发、Merge你是否有一个规范流程呢&#xff1f;&#x1f4a4; 不论是一个团队一起开发一个项目&#xff0c;还是自己独立开发一个项目&#xff0c;都少不了要和Git打交道&…

C++学习笔记——static对象

一、static对象——累计创建了多少对象和正在使用的对象数目 static更多的是作为一个介入类的一个第三方成员变量。 声明为static的类成员称为类的静态成员&#xff0c;用static修饰的成员变量&#xff0c;称之为静态成员变量&#xff1b; 用static修饰的成员函数&#xff0c;称…

JS逆向之wasm逆向(二)

本文仅供技术交流和技术学习 不做其他用途 接着上一篇继续讲&#xff1a; 上篇地址&#xff1a; JS逆向之wasm逆向(二进制) 网址&#xff1a; aHR0cHM6Ly93d3cuN3E2Y3lqLmNvbTo5MDAxL3JlZ2lzdGVyNDY5Njg/aV9jb2RlPTQ0Mjc5OTU1 这个网站我们后面可以继续讲他的debugger 和滑块…

Spring Boot 整合MyBatis-Plus 详解

MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 全新的 MyBatis-Plus 3.0 版本基于 JDK8&#xff0c;提供了 lambda 形…

【数据结构】树和二叉树详解

目录 1. 前言2. 树概念及结构2.1. 树的概念2.2. 与树有关的一些概念2.3. 树与非树2.4. 树的表示 3. 二叉树概念及结构3.1. 二叉树概念3.2. 特殊的二叉树3.3. 二叉树的性质3.4 二叉树的存储结构3.4.1 顺序存储3.4.2 链式存储 3.5 堆 1. 前言 在前面我们一起了解的数据结构有顺序…

振南技术干货集:制冷设备大型IoT监测项目研发纪实(6)

注解目录 1.制冷设备的监测迫在眉睫 1.1 冷食的利润贡献 1.2 冷设监测系统的困难 &#xff08;制冷设备对于便利店为何如何重要&#xff1f;了解一下你所不知道的便利店和新零售行业。关于电力线载波通信的论战。&#xff09; 2、电路设计 2.1 防护电路 2.1.1 强电防护 …

初识JVM(简单易懂),解开JVM神秘的面纱

目录 一、什么是JVM&#xff08;Java虚拟机&#xff09;&#xff1f; 二、JVM的功能 三、JVM的功能-即时编译 四、常见的JVM 五、JVM的组成 五、JVM的工作流程 参考资料 一、什么是JVM&#xff08;Java虚拟机&#xff09;&#xff1f; 在Java的世界里&#xff0c;Java虚…

【实验】配置用户自动获取IPv6地址的案例

【赠送】IT技术视频教程&#xff0c;白拿不谢&#xff01;思科、华为、红帽、数据库、云计算等等​编辑https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502【…

云贝教育 |【技术文章】PG的缓存管理器原理

PG的缓存管理器原理 缓冲区管理器管理共享内存和持久存储之间的数据传输 &#xff0c; 它会对 DBMS 的性能产生重大影响。 PostgreSQL 缓冲区管理器工作非常高效。 本章介绍 PostgreSQL 缓冲区管理器。第一部分提供概述 &#xff0c;后续部分描述以下主题&#xff1a; 缓冲…

OSG动画与声音-路径动画之导出与导入(2)

路径的导出示例 路径的导出示例的代码如程序清单10-2所示。 1. // 创建路径 2. osg::ref_ptr<osg::AnimationPath> createAnimationPath(osg::Vec3 ¢er, 3. float radius, float looptime) 4. { 5. // 创建一个Path对象 6. osg::ref_ptr<…