洛谷题目 P1006 [NOIP2008 提高组] 传纸条 题解 (本题较难)

题目传送门:

P1006 [NOIP2008 提高组] 传纸条 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

前言:

        本题来源于2008年NOIp 提高组竞赛题目:传纸条,本题涉及到动态DP、图论里的费用流知识点,学过图论的都应该对这道题熟能生巧,可以说非常的简单,但是对于刚学图论的初学者来说也是一个挑战,本题较难将详细了解。(我觉得太简单了!

# 解题思路:

        1、状态设计:

                由于我们需要考虑两条路径,直接设计状态比较复杂。我们可以使用四维动态规划数组

dp[x1][y1][x2][y2] 来表示:

                dp[x1][y1][x2][y2] 表示:                 

  • 一条路径从 (1,1) 到达 (x1, y1)

  • 另一条路径从 (m,n) 到达 (x2, y2)

  • 在这两条路径上,经过的同学的好心程度之和的最大值。

        2、状态初始化:

                起点(1,1)与终点(m,n)是固定的,因此:                                                                            dp[1][1][m][n]=grid[1][1]+grid[m][n]因为这两点的好心程度必须计算。

        3、状态转移:

                对于任意状态 dp[x1][y1][x2][y2],我们要考虑一下几种转移方式:

                        1.1、两条路径分别乡下或向右移动:                       

  • (x1, y1) 向下移动到 (x1+1, y1)(x2, y2) 向下移动到 (x2+1, y2)

  • (x1, y1) 向右移动到 (x1, y1+1)(x2, y2) 向右移动到 (x2, y2+1)

                      1.2、一条路径向下,另一条路径向右:

  • (x1, y1) 向下移动到 (x1+1, y1)(x2, y2) 向右移动到 (x2, y2+1)

  • (x1, y1) 向右移动到 (x1, y1+1)(x2, y2) 向下移动到 (x2+1, y2)

 在每种转移中,我们需要加上当前点的好心程度。如果两条路径在某一点重合(即 (x1, y1) == (x2, y2)),则该点的好心程度只能计算一次。

        4、边界条件:

                        如果两条路径在某一点重合(除起点和重点),则该状态无效

                        即 dp[x1][y1][x2][y2] = -1)。

                        如果两条路径分别到达终点(m,n)和起点(1,1),则dp[m][n][1][1]

                        即为最终答案。

        5、动态规划顺序:  

        由于状态转移是从较小的坐标向较大的坐标进行的,因此我们需要按照坐标从小到大的顺序填充 dp 数组。具体来说:

  • 外层循环:x1y1,表示从 (1,1)(m,n) 的路径。

  • 内层循环:x2y2,表示从 (m,n)(1,1) 的路径。

##优化思路:

        优化1、二维动态规划:

                我们可以将两条路径的动态规划合并为一个二维状态:

                1.1、定义 dp[i][j][k][l] 表示两条路径分别到达(i,j)和(k,l)的最大好心程度和。

                1.2、由于两条路径不能相重叠,因此  i+j=k+1 (即两条路径的总步数相同)。

                1.3、因此,我们可以将状态压缩为 dp[i][j][k] ,期中 l=i+j-k 。

        优化2、空间优化:

               在实际实现中,可以使用滚动数组的方式进一步优化空间复杂度,将四维数组压缩为三维或二维数组。

###代码:

#include <bits/stdc++.h>
using namespace std;
int m, n;
int main() {
    cin >> m >> n;

    vector<vector<int>> r(m + 1, vector<int>(n + 1));
    for (int i = 1; i <= m; ++i) {
        for (int j = 1; j <= n; ++j) {
            cin >> r[i][j];
        }
    }
    vector<vector<vector<vector<int>>>> dp(m + 1, vector<vector<vector<int>>>(n + 1,
        vector<vector<int>>(m + 1, vector<int>(n + 1, -1))));
    dp[1][1][1][1] = r[1][1];
    for (int x1 = 1; x1 <= m; ++x1) {
        for (int y1 = 1; y1 <= n; ++y1) {
            for (int x2 = 1; x2 <= m; ++x2) {
                for (int y2 = 1; y2 <= n; ++y2) {
                    if (dp[x1][y1][x2][y2] == -1) continue;
                    if (x1 < m && x2 < m) {
                        dp[x1 + 1][y1][x2 + 1][y2] = max(dp[x1 + 1][y1][x2 + 1][y2],
                            dp[x1][y1][x2][y2] + r[x1 + 1][y1] + (x1 + 1 != x2 + 1 || y1 != y2 ? r[x2 + 1][y2] : 0));
                    }
                    if (x1 < m && y2 < n) {
                        dp[x1 + 1][y1][x2][y2 + 1] = max(dp[x1 + 1][y1][x2][y2 + 1],
                            dp[x1][y1][x2][y2] + r[x1 + 1][y1] + (x1 + 1 != x2 || y1 != y2 + 1 ? r[x2][y2 + 1] : 0));
                    }
                    if (y1 < n && x2 < m) {
                        dp[x1][y1 + 1][x2 + 1][y2] = max(dp[x1][y1 + 1][x2 + 1][y2],
                            dp[x1][y1][x2][y2] + r[x1][y1 + 1] + (x1 != x2 + 1 || y1 + 1 != y2 ? r[x2 + 1][y2] : 0));
                    }
                    if (y1 < n && y2 < n) {
                        dp[x1][y1 + 1][x2][y2 + 1] = max(dp[x1][y1 + 1][x2][y2 + 1],
                            dp[x1][y1][x2][y2] + r[x1][y1 + 1] + (x1 != x2 || y1 + 1 != y2 + 1 ? r[x2][y2 + 1] : 0));
                    }
                }
            }
        }
    }
    cout << dp[m][n][m][n] << endl;
    return 0;
}

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

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

相关文章

智能电动汽车 --- 人工智能(AI)入门

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

VUE之路由Props、replace、编程式路由导航、重定向

目录 1、路由_props的配置 2、路由_replaces属性 3、编程式路由导航 4、路由重定向 1、路由_props的配置 1&#xff09;第一种写法&#xff0c;将路由收到的所有params参数作为props传给路由组件 只能适用于params参数 // 创建一个路由器&#xff0c;并暴露出去// 第一步…

VS C++ 配置OPENCV环境

VS C 配置OPENCV环境 1.下载opencv2.安装环境3.opencv环境4.VS配置opencv环境5.EXE执行文件路径的环境lib和dll需要根据是debug还是release环境来区分使用哪个 6.Windows环境 1.下载opencv 链接: link 2.安装环境 双击运行即可 3.opencv环境 include文件路径:opencv\build\…

【Redis】持久化机制

目录 前言&#xff1a; RDB 触发RDB持久化方法有俩种&#xff1a; 1.手动触发 2.自动触发 RDB文件的优缺点&#xff1a; AOF: AOF工作机制&#xff1a;​编辑 ​编辑重写机制&#xff1a; 前言&#xff1a; Redis是一个内存数据库&#xff0c;将数据存储在内存中&…

蓝桥杯lesson3---string的使用

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” string的概念 string字符串是一种更加高级的封装&#xff0c;string字符串中包含了大量的方法&#xff0c;这些方法使得字符串的操作变得更加简单&#xff0c;string的使用&…

Arduino D1 通过 Wi-Fi 控制 LED

Arduino D1 通过 Wi-Fi 控制 LED 硬件连接 将 LED 的正极&#xff08;长脚&#xff09;连接到 Arduino D1 的 D1 引脚。将 LED 的负极&#xff08;短脚&#xff09;通过一个电阻&#xff08;例如 220 欧姆&#xff09;连接到 Arduino D1 的 GND 引脚。 安装必要的库 在 Ard…

大模型 / 智能体在智能运维领域的应用总结与发展趋势概述

智能体 智能运维 &#xff1f; 回顾大模型的发展 大模型的发展在过去两年间呈现出爆炸式的增长&#xff0c;成为推动人工智能领域快速进步的关键力量。 2023年3月&#xff1a;百度发布了其知识增强的大语言模型产品“文心一言”&#xff0c;这标志着国内AI大模型产业竞争的…

Unity中在UI上画线

在UI中画一条曲线 我封装了一个组件,可以实现基本的画线需求. 效果 按住鼠标左键随手一画. 用起来也很简单,将组件挂到空物体上就行了,红色的背景是Panel. 你可以将该组件理解为一个Image,只不过形状更灵活一些罢了,所以它要放在下面的层级(不然可能会被挡住). 代码 可以…

【自然语言处理(NLP)】介绍、发展史

文章目录 介绍发展史1. 规则驱动时期&#xff08;20世纪50年代-80年代&#xff09;技术特点标志性成果 2. 统计方法兴起&#xff08;1990年代-2000年代&#xff09;技术特点标志性成果 3. 神经网络复兴&#xff08;2010年代初至今&#xff09;技术特点标志性成果 4. 集成与应用…

【书籍连载】《软件测试架构实践与精准测试》| 川模型的价值

各位软件领域的精英们&#xff0c;今天小编邀请你继续深入学习《软件测试架构实践与精准测试》。 《软件测试架构实践与精准测试》是作者李龙&#xff08;安畅检测首席技术专家&#xff09;基于软件测试“川模型”的著作。本书结合作者首次提出的软件测试新的模型“川模型”测试…

RPC是什么?和HTTP区别?

RPC 是什么&#xff1f;HTTP 是什么&#xff1f; 作为一个程序员&#xff0c;假设我们需要从A电脑的进程发送一段数据到B电脑的进程&#xff0c;我们一般会在代码中使用 Socket 进行编程。 此时&#xff0c;可选性一般就是 TCP 和 UDP 二选一&#xff0c;由于 TCP 可靠、UDP…

08.七种排序算法实现(C语言)

目录 一.排序的基本概念 1.1 排序的概念 1.2 常见的排序算法 二.常见排序算法的实现 2.1 插入排序&#xff08;直接&#xff09; 1.基本思想 2.直接插入排序的特性 3.代码实现 2.2 希尔排序 1.基本思想 2.希尔插入排序的特性 3.代码实现 2.3 选择排序 1.基本思想 2…

Jmeter使用Request URL请求接口

简介 在Jmeter调试接口时&#xff0c;有时不清楚后端服务接口的具体路径&#xff0c;可以使用Request URL和cookie来实现接口请求。以下内容以使用cookie鉴权的接口举例。 步骤 ① 登录网站后获取具体的Request URL和cookie信息 通过浏览器获取到Request URL和cookie&#…

Apache Tomcat文件包含漏洞复现(详细教程)

1.漏洞原理 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;其安装后会默认开启ajp连接器&#xff0c;方便与其他web服务器通过ajp协议进行交互。属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发…

fpga学习入门 串口rs232回环

奇偶检验位这里是省略了 做好回环后可以使用上位机做回环测试&#xff0c;top文件写的方式就是将rx&#xff08;fpga端&#xff09;接受到的模块&#xff08;pc端&#xff09;tx发送出去&#xff0c;这两个端口用杜邦线连接&#xff0c;同理模块的rx连接fpga的tx&#xff0c;…

KETTLE-SAP抽数报错RFC_ERROR_SYSTEM_FAILURE

KETTLE调SAP 合并ECCS相关的函数时报错 2025/01/23 17:56:02 - SAP input.0 - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-11-14 10.30.55 by buildguy) : Unexpected error 2025/01/23 17:56:02 - SAP input.0 - ERROR (version 8.2.0.0-342, build 8.2.0.0-3…

HTTP 配置与应用(局域网)

想做一个自己学习的有关的csdn账号&#xff0c;努力奋斗......会更新我计算机网络实验课程的所有内容&#xff0c;还有其他的学习知识^_^&#xff0c;为自己巩固一下所学知识&#xff0c;下次更新HTTP 配置与应用&#xff08;不同网段&#xff09;。 我是一个萌新小白&#xf…

C++AVL树(一)详解

文章目录 AVL树概念AVL树的插入平衡因子的更新旋转的规则左单旋右单旋抽象的情况h0h1h 2h 3 AVL树 概念 AVL树是一棵平衡二叉查找树&#xff0c;AVL树是空树&#xff0c;保证左右子树都是AVL树&#xff0c;AVL树要求高度差的绝对值不超过1&#xff0c;因为最好情况是1&#…

MCP Server 开发实战:无缝对接 LLM 和 Elasticsearch

在一文带你入门 MCP&#xff08;模型上下文协议&#xff09;文章中&#xff0c;我们快速介绍了 MCP 的基本概念&#xff0c;并且通过一个示例让读者初步感受到了 MCP 的强大能力。本文将进一步深入&#xff0c;带领读者一步步学习如何开发一个完整的 MCP Server。本文的完整代码…

Kubernetes v1.28.0安装dashboard v2.6.1(k8s图形化操作界面)

准备工作 Kubernetes v1.28.0搭建教程请参考&#xff1a;Kubernetes v1.28.0集群快速搭建教程-CSDN博客 查看当前集群nodes都是ready状态 查看当前pods都是running状态 下载并修改配置文件 下载 recommended.yaml &#xff0c;下载好之后&#xff0c;进入文件编辑 下载地址…