AcWing1027
题目重述:
题目的核心是找到一条路径的最大权值总和,但路径要从起点 (1, 1)
走到终点 (n, n)
。由于两条路径分别经过不同的格子,我们可以巧妙地将问题简化为两次同时出发的路径问题。这种映射的设计让我们能够更方便地处理两条路径重叠在同一个格子的情况,同时简化状态的描述和转移过程。
同时出发的映射设计:
我们把两次路径的移动过程看作是两个角色同时出发并移动。
- 路径长度(步数)用
k
表示。 - 对于某个步数
k
,两个角色分别位于(x1, y1)
和(x2, y2)
两个位置上。 - 因为两条路径同时出发,满足:
x 1 + y 1 = x 2 + y 2 = k x_1 + y_1 = x_2 + y_2 = k x1+y1=x2+y2=k
这说明步数k
决定了两个角色的行列位置之间的关系。
我们只需要用 3 个状态变量来描述状态:
k
: 当前的步数(路径的长度)。x1
: 角色 1 在当前步数下的行位置。x2
: 角色 2 在当前步数下的行位置。
这样,位置 (y1)
和 (y2)
则可以通过 y1 = k - x1
和 y2 = k - x2
推出。
DP 状态定义:
用 f[k][x1][x2]
表示在步数 k
时,两个角色分别位于 (x1, y1)
和 (x2, y2)
位置时,能达到的最大权值总和。
重叠格子的处理:
-
两条路径走到不同的格子:
如果两个角色的行位置不同 (x1 ≠ x2
),说明它们当前站在不同的格子上,则权值总和为:
w ( x 1 , k − x 1 ) + w ( x 2 , k − x 2 ) w(x1, k - x1) + w(x2, k - x2) w(x1,k−x1)+w(x2,k−x2) -
两条路径走到相同的格子:
如果两个角色的行位置相同 (x1 = x2
),说明它们当前站在同一个格子上,此时我们只加一次该格子的权值:
w ( x 1 , k − x 1 ) w(x1, k - x1) w(x1,k−x1)
状态转移:
在步数 k
时,每个角色都有两种选择:向右走或向下走。
这导致从 k-1
时的状态到 k
时的状态共有 4 种可能的转移路径:
f [ k ] [ x 1 ] [ x 2 ] = max { f [ k − 1 ] [ x 1 − 1 ] [ x 2 − 1 ] , f [ k − 1 ] [ x 1 ] [ x 2 − 1 ] , f [ k − 1 ] [ x 1 − 1 ] [ x 2 ] , f [ k − 1 ] [ x 1 ] [ x 2 ] } + w f[k][x1][x2] = \max \left\{ \begin{aligned} &f[k - 1][x1 - 1][x2 - 1], \\ &f[k - 1][x1][x2 - 1], \\ &f[k - 1][x1 - 1][x2], \\ &f[k - 1][x1][x2] \end{aligned} \right\} + w f[k][x1][x2]=max⎩ ⎨ ⎧f[k−1][x1−1][x2−1],f[k−1][x1][x2−1],f[k−1][x1−1][x2],f[k−1][x1][x2]⎭ ⎬ ⎫+w
其中,w
的值根据上述重叠情况确定。
越界判断的必要性:
在进行状态转移时,需要保证所有涉及的状态都在合法范围内。
由于 x1
和 x2
代表行位置,所以需要确保它们不会越过棋盘边界。
即:
1 ≤ x 1 , x 2 ≤ n 且 1 ≤ y 1 = k − x 1 ≤ n 1 ≤ y 2 = k − x 2 ≤ n 1 \leq x1, x2 \leq n \quad \text{且} \quad 1 \leq y1 = k - x1 \leq n \quad 1 \leq y2 = k - x2 \leq n 1≤x1,x2≤n且1≤y1=k−x1≤n1≤y2=k−x2≤n
这正是代码中越界判断的由来:
if (k - i <= 0 || k - i > n || k - j <= 0 || k - j > n) continue;
这个判断确保每个角色的当前位置都在合法范围 [1, n]
之内。否则,跳过当前状态,避免数组越界访问。
DP分析
-
初始状态:
从起点(1, 1)
同时出发:
f [ 2 ] [ 1 ] [ 1 ] = w ( 1 , 1 ) f[2][1][1] = w(1, 1) f[2][1][1]=w(1,1) -
目标状态:
当两条路径同时到达终点(n, n)
,即:
f [ 2 ∗ n ] [ n ] [ n ] f[2 * n][n][n] f[2∗n][n][n]
该状态的值即为答案。 -
过程分析
代码
#include <iostream>
#include <algorithm> // 引入算法库以使用 std::maxusing namespace std;const int N = 15, M = 2 * N;int n;
int a, b, c;
int w[N][N];
int f[M][N][N];int main()
{cin >> n;while (cin >> a >> b >> c, a || b || c) w[a][b] += c;for (int k = 2; k <= 2 * n; ++k){for (int i = 1; i <= n; ++i){for (int j = 1; j <= n; ++j){if (k - i <= 0 || k - i > n || k - j <= 0 || k - j > n) continue;/*判断逻辑:这段判断确保两个角色的当前位置 (i, k - i) 和 (j, k - j) 是在有效的棋盘范围内。k - i <= 0:确保角色 1 的列位置不小于 1。k - i > n:确保角色 1 的列位置不大于 n(棋盘的边界)。k - j <= 0:确保角色 2 的列位置不小于 1。k - j > n:确保角色 2 的列位置不大于 n。如果任何一条路线越界,就执行 continue,跳过这一次的计算。*/int v = w[i][k - i];if (i != j) v += w[j][k - j];f[k][i][j] = max({f[k - 1][i - 1][j - 1], f[k - 1][i][j - 1], f[k - 1][i - 1][j], f[k - 1][i][j]}) + v;}}}cout << f[2 * n][n][n] << endl;return 0;
}
f[k - 1][i][j]}) + v;}}
}cout << f[2 * n][n][n] << endl;
return 0;
}
相关文章:

AcWing1027
题目重述: 题目的核心是找到一条路径的最大权值总和,但路径要从起点 (1, 1) 走到终点 (n, n)。由于两条路径分别经过不同的格子,我们可以巧妙地将问题简化为两次同时出发的路径问题。这种映射的设计让我们能够更方便地处理两条路径重叠在同一…...
23 Shell Script服务脚本
Linux 服务脚本 一、Linux 开机自动启动服务 linux开机服务原理: ①linux系统启动首先加载kernel ②初始操作系统 ③login验证程序等待用户登陆 初始化操作系统 kernel加载/sbin/init创建用户空间的第一个程序 该程序完成操作系统的初…...
三周精通FastAPI:3 查询参数
查询参数 FastAPI官网手册:https://fastapi.tiangolo.com/zh/tutorial/query-params/ 上节内容:https://skywalk.blog.csdn.net/article/details/143046422 声明的参数不是路径参数时,路径操作函数会把该参数自动解释为**查询**参数。 from…...
大语言模型学习指南:入门、应用与深入
0x00 学习路径概述 本文将学习路径划分为三个部分:入门篇、应用篇、深入篇。每个章节针对不同的学习需求,帮助你从基础知识入手,逐步掌握大语言模型(LLM)的使用、应用开发以及技术原理等内容。 学习目标 入门篇&…...

【Linux-进程间通信】匿名管道+4种情况+5种特征
匿名管道 匿名管道(Anonymous Pipes)是Unix和类Unix操作系统中的一种通信机制,用于在两个进程之间传递数据。匿名管道通常用于命令行工具之间的数据传递; 匿名管道的工作原理是创建一个临时文件,该文件被称为管道文件…...

Perl打印9x9乘法口诀
本章教程主要介绍如何用Perl打印9x9乘法口诀。 一、程序代码 1、写法① use strict; # 启用严格模式,帮助捕捉变量声明等错误 use warnings; # 启用警告,帮助发现潜在问题# 遍历 1 到 9 的数字 for my $i (1..9) {# 对于每个 $i,遍历 1…...

Android--第一个android程序
写在前边 ※安卓开发工具常用模拟器汇总Android开发者必备工具-常见Android模拟器(MuMu、夜神、蓝叠、逍遥、雷电、Genymotion...)_安卓模拟器-CSDN博客 ※一般游戏模拟器运行速度相对较快,本文选择逍遥模拟器_以下是Android Studio连接模拟器实现(先从以上博文中…...
MySQL的并行复制原理
1. 并行复制的概念 并行复制(Parallel Replication)是一种通过同时处理多个复制任务来加速数据复制的技术。它与并发复制的区别在于,并行复制更多关注的是数据块或事务之间的并行执行,而不是单纯的任务并发。在数据库主从复制中&…...

2023年五一杯数学建模C题双碳目标下低碳建筑研究求解全过程论文及程序
2023年五一杯数学建模 C题 双碳目标下低碳建筑研究 原题再现: “双碳”即碳达峰与碳中和的简称,我国力争2030年前实现碳达峰,2060年前实现碳中和。“双碳”战略倡导绿色、环保、低碳的生活方式。我国加快降低碳排放步伐,大力推进…...

信息安全工程师(57)网络安全漏洞扫描技术与应用
一、网络安全漏洞扫描技术概述 网络安全漏洞扫描技术是一种可以自动检测计算机系统和网络设备中存在的漏洞和弱点的技术。它通过使用特定的方法和工具,模拟攻击者的攻击方式,从而检测存在的漏洞和弱点。这种技术可以帮助组织及时发现并修补漏洞ÿ…...
练习题 - Scrapy爬虫框架 Spider Middleware 爬虫页中间件
在 web 爬虫开发中,Scrapy 是一个非常强大且灵活的框架,它可以帮助开发者轻松地从网页中提取数据。Scrapy 的下载器中间件(Downloader Middleware)是 Scrapy 处理下载请求和响应的一个重要组件。通过使用和编写下载器中间件,开发者可以自定义请求的处理过程,增加请求头信…...
探索C++的工具箱:双向链表容器类list(1)
引言 在C中,std::list 是一个标准库提供的容器类,属于C STL(标准模板库)。std::list 是一种独特而强大的容器,它使用双向链表结构来管理元素。无论是在处理动态数据集合,还是在需要频繁进行插入和删除操作时…...
大厂高频算法考点--单调栈
什么是单调栈: 单调栈就是借助一个栈,在仅仅使用当前栈的条件下,时间复杂度是N(n),将每个节点最有离这他最近的大于或者是小于的数据返回,将已知数组的元素放到栈里。再自我实现的代码里面我们使用数组实现…...

Unity使用Git及GitHub进行项目管理
git: 工作区,暂存区(存放临时要存放的内容),代码仓库区1.初始化 git init 此时展开隐藏项目,会出现.git文件夹 2.减小项目体积 touch .gitignore命令 创建.gitignore文件夹 gitignore文件夹的内容 gitignore中添加一下内容 # This .gitignore file should be place…...

如何将本地 Node.js 服务部署到宝塔面板:完整的部署指南
文章简介: 将本地开发的 Node.js 项目部署到线上服务器是开发者常见的工作流程之一。在这篇文章中,我将详细介绍如何将本地的 Node.js 服务通过宝塔面板(BT 面板)上线。宝塔面板是一个强大的服务器管理工具,具有简洁的…...

SpringBoot项目启动报错:命令行太长解决
文章目录 SpringBoot项目启动报错:命令行太长解决1. 第一种方法1. 第二种方法1-1 旧版本Idea1-2 新版本Idea 3. 重新启动SpringBoot项目即可解决 SpringBoot项目启动报错:命令行太长解决 报错信息: 1. 第一种方法 1. 第二种方法 找到项目…...

使用Docker启动的Redis容器使用的配置文件路径等问题以及Python使用clickhouse_driver操作clickhouse数据库
一、使用Docker启动的Redis容器使用的配置文件路径等问题 1.docker启动的redis使用的配置文件路径是什么 使用docker搭建redis服务,本身redis启动的时候可以指定配置文件的, redis-server /指定配置文件路径/redis.conf。 但手上也没有一个redis配置文件…...

硬盘格式化后能恢复数据吗?4款好用的数据恢复软件,格式化后也能安心
咱们今天来谈谈一个挺烦人的问题——硬盘格式化后能恢复数据吗?别担心,能的!只要你用对方法,就算硬盘被清空了,那些重要文件还是能找回来的。下面,我就给你们介绍几款超给力的数据恢复软件,让你…...
【选择C++游戏开发技术】
在选择C游戏开发技术时,以下几个因素是需要考虑的: 1. 游戏类型:不同类型的游戏可能需要不同的技术。例如,2D游戏通常采用基于精灵的引擎,而3D游戏通常采用基于物理模拟的引擎。根据游戏类型选择适合的技术是很重要的…...

Oracle数据库系统表空间过大,清理SYSTEM、SYSAUX表空间
一.前言 在oracle数据库中,system为系统表空间,存放着一些我们经常用到的系统表和视图,sysaux为辅助表空间,辅助着系统表空间。这两个表空间不宜添加数据文件,会使系统表空间过于臃肿,从而影响数据库的使用…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...