NO.84十六届蓝桥杯备战|动态规划-路径类DP|矩阵的最小路径和|迷雾森林|过河卒|方格取数(C++)

路径类dp是线性dp的⼀种,它是在⼀个n×m的矩阵中设置⼀个⾏⾛规则,研究从起点⾛到终点的⽅案数、最⼩路径和或者最⼤路径和等等的问题

矩阵的最小路径和_牛客题霸_牛客网

![[Pasted image 20250409194955.png]]

  1. 状态表⽰:
    dp[i][j]表⽰:到达[i, j]位置处,最⼩路径和是多少。
    那我们的最终结果就是dp[n][m]
  2. 状态转移:
    到达[i, j] 位置之前的⼀⼩步,有两种情况:
    i. 从[i - 1, j] 向下⾛⼀步,转移到[i, j] 位置;
    ii. 从[i, j - 1] 向右⾛⼀步,转移到[i, j] 位置。
    由于到[i, j]位置两种情况,并且我们要找的是最⼩路径,因此只需要这两种情况下的最⼩值,再加上[i,j]位置上本⾝的值即可:dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + a[i][j]
  3. 初始化:
    第⼀⾏和第⼀列是要初始化的,因为会越界访问。
    但是如果把整张表初始化为⽆穷⼤,然后把dp[0][1]dp[1][0]的值设为0,后续填表就是正确的。
  4. 填表顺序:
    根据「状态转移⽅程」的推导来看,填表的顺序就是「从上往下」填每⼀⾏,每⼀⾏「从左往
    后」
#include <bits/stdc++.h>
using namespace std;const int N = 510;int n, m;
int f[N][N];int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n >> m;//初始化memset(f, 0x3f, sizeof f);f[0][1] = 0;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){int x; cin >> x;f[i][j] = min(f[i-1][j], f[i][j-1]) + x;}}cout << f[n][m] << endl;return 0;
}
迷雾森林
  1. 状态表⽰:
    f[i][j]表⽰:到达[i, j]位置时,有多少种⽅案。
    那么f[1][m]就是我们要的结果。
  2. 状态转移⽅程:
    a. 如果[i, j]位置是空地,到达[i, j]位置有两种⽅式:
  • [i + 1, j]向上⾛⼀步,此时的⽅案数为f[i + 1][j]
  • [i, j - 1]向右⾛⼀步,此时的⽅案数为f[i][j - 1]
    两者总和就是到达[i, j]位置的总⽅案数。
    b. 如果[i, j]位置是树,⽆法⾛到,f[i][j] = 0
  1. 初始化:
    可以在原始矩阵的规模上多加上⼀⾏和⼀列,把f[n + 1][1]或者f[n][0]初始化为1,这样后
    续填表就会有意义。
  2. 填表顺序:
    从下往上每⼀⾏,每⼀⾏从左往右
#include <bits/stdc++.h>
using namespace std;const int N = 3010, MOD = 2333;int n, m;
int a[N][N];
int f[N][N];int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n >> m;for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)cin >> a[i][j];//初始化f[n][0] = 1;for (int i = n; i >= 1; i--)for (int j = 1; j <= m; j++)if (a[i][j] == 0)f[i][j] = (f[i][j-1] + f[i+1][j]) % MOD;cout << f[1][m] << endl;return 0;
}
P1002 [NOIP 2002 普及组] 过河卒 - 洛谷

![[Pasted image 20250409204459.png]]

  1. 状态表⽰:
    f[i][j]表⽰:到达[i, j]位置的⽅案数。
    那么f[n][m]就是我们要的结果。
  2. 状态转移⽅程:
    a. 如果[i, j]位置能⾛到,到达[i, j]位置之前的⼀⼩步,有两种情况:
  • [i - 1, j]向下⾛⼀步,⾛到[i, j] ,此时的⽅案数为f[i - 1][j]
  • [i, j - 1]向右⾛⼀步,⾛到[i, j] ,此时的⽅案数为f[i][j - 1]
    那么总⽅案数f[i][j] = f[i - 1][j] + f[i][j - 1]
    b. 如果[i, j]位置⾛不到,f[i][j] = 0
  1. 初始化:
    我们可以给原始的矩阵多加⼀⾏多加⼀列,n, m, x, y全部+1 ,这样填任何⼀个位置都不会越
    界。
    然后初始化f[1][0] = 1 或者f[0][1] = 1 ,保证后续填表正确即可。
  2. 填表顺序:
    从上往下每⼀⾏,每⼀⾏从左往右
#include <bits/stdc++.h>
using namespace std;typedef long long LL;const int N = 25;int n, m, a, b;
LL f[N][N];bool check(int i, int j)
{return (i == a && j == b) || (i != a && j != b && abs(i - a) + abs(j - b) == 3);
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n >> m >> a >> b;n++; m++; a++; b++;//初始化f[0][1] = 1;for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++){if (check(i, j)) continue;f[i][j] = f[i-1][j] + f[i][j-1];}cout << f[n][m] << endl;return 0;
}
P1004 [NOIP 2000 提高组] 方格取数 - 洛谷

![[Pasted image 20250409212610.png]]

贪⼼+两次dp是错误的,因为两次最优不等于全局最优,可以举出反例。正解应该是同时去⾛两条路,两者相互影响,所以放在⼀起考虑。

  1. 状态表⽰:
    需要知道当前这两条路径⾛到什么位置,因此需要四维 f [ i 1 ] [ j 1 ] [ i 2 ] [ j 2 ] f[i_{1}][j_{1}][i_{2}][j_{2}] f[i1][j1][i2][j2]来表⽰第⼀条路⾛到 [ i 1 ] [ j 1 ] [i_{1}][j_{1}] [i1][j1]第⼆条路⾛到 [ i 2 ] [ j 2 ] [i_{2}][j_{2}] [i2][j2]
    但是我们发现,因为两者是同时出发的,所以横纵坐标之和是⼀个定值。也就是说,只要知道了横纵坐标之和,以及两者的横坐标,就可以计算出纵坐标,状态表⽰就可以优化掉⼀维。
    优化后的状态表⽰: f [ s t ] [ i 1 ] [ i 2 ] f[st][i_{1}][i_{2}] f[st][i1][i2]表⽰:第⼀条路在 [ i 1 , s t − i 1 ] [i_{1},st-i_{1}] [i1,sti1] ,第⼆条路在 [ i 2 , s t − i 2 ] [i_{2},st-i_{2}] [i2,sti2]时,两者的路径最⼤和。那我们的最终结果就是 f [ n × 2 ] [ n ] [ n ] f[n \times 2][n][n] f[n×2][n][n]
  2. 状态转移⽅程:
    第⼀条路可以从上 [ i 1 − 1 , s t − i 1 ] [i_{1}-1,st-i_{1}] [i11,sti1]或者左 [ i 1 , s t − i 1 − 1 ] [i_{1},st-i_{1}-1] [i1,sti11]⾛到 [ i 1 , s t − i 1 ] [i_{1},st-i_{1}] [i1,sti1]位置;第⼆条路可
    以从上 [ i 2 − 1 , s t − i 2 ] [i_{2}-1,st-i_{2}] [i21,sti2]或者左 [ i 2 , s t − i 2 − 1 ] [i_{2},st-i_{2}-1] [i2,sti21]⾛到 [ i 2 , s t − i 2 ] [i_{2},st-i_{2}] [i2,sti2]位置。排列组合⼀下⼀共4中情况,分别是:
  • 上+上,此时的最⼤和为:f[st - 1][i1 - 1][i2 - 1]
  • 上+左,此时的最⼤和为:f[st - 1][i1 - 1][i2]
  • 左+上,此时的最⼤和为:f[st - 1][i1 2 ][i - 1]
  • 左+左,此时的最⼤和为:f[st - 1][i1 2 ][i ]
    取上⾯四种情况的最⼤值,然后再加上a[i1][j1]a[i2][j2]。但是要注意,如果两个路径当前在同⼀位置时,只⽤加上⼀个a[i1][j1]即可
  1. 初始化:
    算的是路径和,0 不会影响最终结果,直接填表。
  2. 填表顺序:
    先从⼩到⼤循环横纵坐标之和,然后依次从⼩到⼤循环两者的横坐标
#include <bits/stdc++.h>
using namespace std;const int N = 15;
int n;
int a[N][N];
int f[N*2][N][N];int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n;int x, y, w;while (cin >> x >> y >> w, x){a[x][y] = w;    }for (int s = 2; s <= n+n; s++){for (int i1 = 1; i1 <= n; i1++){for (int i2 = 1; i2 <= n; i2++){int j1 = s - i1, j2 = s - i2;if (j1 <= 0 || j1 > n || j2 <= 0 || j2 > n) continue;int t = f[s-1][i1][i2];t =  max(t, f[s-1][i1][i2-1]);t =  max(t, f[s-1][i1-1][i2]);t =  max(t, f[s-1][i1-1][i2-1]);if (i1 == i2){f[s][i1][i2] = t + a[i1][j1];}else{f[s][i1][i2] = t + a[i1][j1] + a[i2][j2];}}}}cout << f[n+n][n][n] << endl;return 0;
}

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

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

相关文章

openlayers入门01 -- 环境配置和初始化地图

openlayers入门 openlayers开发环境配置 1.下载VSCode 官网地址&#xff1a;https://code.visualstudio.com/ 点击Download for Windows 2.安装汉化插件和openlayers插件 搜索chinese&#xff0c;下载Chinese (Simplified) (简体中文) Language Pack 更改语言并重启 搜…

最新版DataGrip超详细图文安装教程,带补丁包(2025最新版保姆级教程)

目录 前言 一、DataGrip最新版下载 二、DataGrip安装 三、DataGrip补丁 四、运行DataGrip 前言 DataGrip 是由 JetBrains 公司开发的一款专业的跨平台数据库管理工具&#xff0c;主要用于连接、管理和操作多种主流关系型数据库及部分 NoSQL 数据库。它支持 MySQL、Postgre…

25年时代电服社招入职Verify测评SHL题库语言理解数字推理考什么?

宁德时代语言理解 语言理解部分主要考察应聘者的语言表达和逻辑思维能力&#xff0c;题型包括阅读理解、逻辑填空和语句排序。阅读理解要求应聘者快速捕捉文章的主旨和细节信息&#xff0c;能够迅速把握文章的核心观点&#xff1b;逻辑填空需要在给定的语句中填入最合适的词汇…

QML 弹窗控件:Popup的基本用法与样式

目录 引言相关阅读Popup基本属性工程结构示例实现Main.qml - 主界面SimplePopup.qml - 简单弹窗ModalPopup.qml - 模态弹窗CustomPopup.qml - 自定义样式弹窗AnimatedPopup.qml - 带动画的弹窗 总结工程下载 引言 在现代图形用户界面(GUI)开发中&#xff0c;弹窗(Popup)是一种…

SkyWalking + ELK 全链路监控系统整合指南

一、架构设计图 二、核心组件部署 1. SkyWalking 集群部署 yaml: # docker-compose-skywalking.yml version: 3.8services:oap:image: apache/skywalking-oap-server:9.7.0ports:- "11800:11800" # gRPC- "12800:12800" # HTTPenvironment:SW_STORAGE: …

DP主站如何华丽变身Modbus TCP网关!

DP主站如何华丽变身Modbus TCP网关&#xff01; 在工业自动化领域&#xff0c;Profibus DP和Modbus TCP是两种常用的通信协议。Profibus DP通常应用于制造业自动化场景&#xff0c;而Modbus TCP则广泛使用于工业自动化和楼宇自动化等领域。为了实现这两种协议之间的互联互通&a…

AI | 字节跳动 AI 中文IDE编辑器 Trae 初体验

Trae 简介与安装 &#x1f526; 什么是 Trae Trae 是大厂字节跳动出品的国内首个 AI IDE&#xff0c;深度理解中文开发场景。AI 高度集成于 IDE 环境之中&#xff0c;为你带来比 AI 插件更加流畅、准确、优质的开发体验。说是能够不用写代码&#xff0c;全靠一张嘴跟 AI 聊天…

Web3 的云基础设施正在成型,Polkadot 2.0 用三项技术改写“上链成本”

在Web3基础设施内卷加剧的今天&#xff0c;“如何以更低成本、更大灵活性部署一条高性能应用链”正成为开发者们最关心的问题。而刚刚走出“技术慢热”误区的Polkadot&#xff0c;正在用一套名为 Polkadot 2.0 的架构升级方案&#xff0c;重新定义这一问题的解法。 这套升级最…

【Linux】39.一个基础的HTTP Web服务器

文章目录 1. 实现一个基础的HTTP Web服务器1.1 功能实现&#xff1a;1.2 Log.hpp-日志记录器1.3 HttpServer.hpp-网页服务器1.4 Socket.hpp-网络通信器1.5 HttpServer.cc-服务器启动器 1. 实现一个基础的HTTP Web服务器 1.1 功能实现&#xff1a; 总体功能&#xff1a; 提供We…

沐渥科技详解氮气柜操作指南

氮气柜是一种通过持续注入高纯度氮气&#xff0c;维持柜内惰性气体环境的设备&#xff0c;用于存储半导体晶圆或其他敏感元件&#xff0c;防止氧化、吸湿和污染。氮气柜操作指南是怎样的&#xff1f;下面沐渥小编给大家介绍一下。 一、操作前准备 &#xff08;1&#xff09;安全…

从零实现Agent智能体配置使用(Ragflow)

从零实现Agent智能体配置使用&#xff08;Ragflow&#xff09; 1. 创建智能体2. 配置智能体2.1 配置问题识别2.2 配置问题分类2.3 不同问题进行单独配置2.4 保存Agent 3. 体验效果 1. 创建智能体 2. 配置智能体 2.1 配置问题识别 2.2 配置问题分类 2.3 不同问题进行单独配置 当…

显示器各类异常处理方法

显示器各类异常处理方法 导航 文章目录 显示器各类异常处理方法导航画面无显示/黑屏/无HDMI信号输入显示器闪烁显示器花屏显示画面模糊或扭曲显示器颜色异常显示器出现死点或亮点 画面无显示/黑屏/无HDMI信号输入 ​ 首先应该检查的是显示器电源&#xff08;真的有人弄掉电源…

原理剖析 + 实战教程 + 资源优化总结大模型微调实战:LoRA / QLoRA / PEFT 全解析,教你低成本玩转大模型微调

随着大语言模型&#xff08;LLM&#xff09;在自然语言处理各领域取得突破性进展&#xff0c;越来越多开发者和企业开始关注模型的微调方式。然而&#xff0c;全参数微调不仅成本高昂、资源要求极高&#xff0c;还容易引发过拟合与知识遗忘等问题。为此&#xff0c;LoRA、QLoRA…

Higress: 阿里巴巴高性能云原生API网关详解

一、Higress概述 Higress是阿里巴巴开源的一款基于云原生技术构建的高性能API网关&#xff0c;专为Kubernetes和微服务架构设计。它集成了Ingress控制器、微服务网关和API网关功能于一体&#xff0c;支持多种协议和丰富的流量管理能力。 发展历程 Higress 从最初社区的 Isti…

解决 IntelliJ IDEA 中 Maven 项目左侧项目视图未显示顶层目录问题的详细步骤说明

以下是解决 IntelliJ IDEA 中 Maven 项目左侧项目视图未显示顶层目录问题的详细步骤说明&#xff1a; 1. 切换项目视图模式 默认情况下&#xff0c;IDEA 的项目视图可能处于 Packages 模式&#xff0c;仅显示代码包结构&#xff0c;而非物理目录。 操作步骤&#xff1a; 点击…

【Vue-vue基础知识】学习笔记

目录 <<回到导览vue基础知识1.1.创建一个vue实例1.2.vue基础指令1.2.1.v-bind1.2.2.v-model1.2.3.常用事件1.2.4.指令修饰符 1.3.计算属性1.3.1.计算属性的完整写法1.3.2.【案例】成绩 1.4.watch1.4.1.watch属性1.4.2.翻译业务实现1.4.3.watch属性的完整写法1.4.4.【案例…

Element Plus 图标使用方式整理

Element Plus 图标使用方式整理 以下是 Element Plus 图标的所有使用方式&#xff0c;包含完整代码示例和总结表格&#xff1a; 1. 按需引入图标组件 适用场景&#xff1a;仅需少量图标时&#xff0c;按需导入减少打包体积 示例代码&#xff1a; <template><div>…

使用Scrapy官方开发的爬虫部署、运行、管理工具:Scrapyd

一般情况下&#xff0c;爬虫会使用云服务器来运行&#xff0c;这样可以保证爬虫24h不间断运行。但是如何把爬虫放到云服务器上面去呢&#xff1f;有人说用FTP&#xff0c;有人说用Git&#xff0c;有人说用Docker。但是它们都有很多问题。 FTP&#xff1a;使用FTP来上传…

41、web前端开发之Vue3保姆教程(五 实战案例)

一、项目简介和需求概述 1、项目目标 1.能够基于Vue3创建项目 2.能够基本Vue3相关的技术栈进行项目开发 3.能够使用Vue的第三方组件进行项目开发 4.能够理解前后端分离的开发模式 2、项目概述 使用Vue3结合ElementPlus,ECharts工具实现后台管理系统页面,包含登录功能,…

OpenCV--图像平滑处理

在数字图像处理领域&#xff0c;图像平滑处理是一项极为重要的技术&#xff0c;广泛应用于计算机视觉、医学影像分析、安防监控等多个领域。在 OpenCV 这一强大的计算机视觉库的助力下&#xff0c;我们能便捷地实现多种图像平滑算法。本文将深入探讨图像平滑的原理&#xff0c;…