动态规划数字三角形模型——AcWing 275. 传纸条

动态规划数字三角形模型

定义

动态规划数字三角形模型是在一个三角形的数阵中,通过一定规则找到从顶部到底部的最优路径或最优值。

运用情况

通常用于解决具有递推关系、需要在不同路径中做出选择以达到最优结果的问题。比如计算最短路径、最大和等。

计算其他类型的最优值。比如,要求找到从顶部到底部路径上数字乘积最大,或者找到具有某种特定属性(如奇数个数最多等)的最优路径。

注意事项

  • 状态定义的准确性:要仔细分析问题,选择最能简洁且准确反映问题本质的状态表示。如果定义不当,可能导致后续递推关系复杂或无法正确求解。
  • 边界条件的多样性:不同问题的边界条件可能不同,比如三角形顶部的状态初始化,或者边缘位置的特殊处理等。
  • 递推关系的严谨性:需要充分考虑各种可能情况,确保递推关系涵盖了所有可能的决策和状态转移。

解题思路

  • 在确定状态时,有时可能需要结合一些额外的信息,比如记录路径本身或其他相关属性。
  • 递推关系的建立可能需要综合考虑多个因素,甚至可能引入辅助数组或变量来辅助计算。
  • 对于复杂的数字三角形问题,可能需要分阶段或分层进行递推计算,逐步逼近最终的最优解。

例如,在一个更复杂的数字三角形中,除了数字本身,每个位置还有一个权重,要求在权重限制下找到最大和。这时状态可能需要扩展为 dp[i][j][k] 表示到达第 i 行第 j 列且当前权重为 k 时的最大和,递推关系也会相应变得更加复杂。通过这样的细致分析和设计,可以更好地运用动态规划数字三角形模型解决各种实际问题。

AcWing 275. 传纸条

题目描述

275. 传纸条 - AcWing题库

运行代码

#include <iostream>
#include <cstring>
using namespace std;
int w[60][60], f[60*60][60][60];
void run()
{int n, m;cin >> n >> m;int a, b, c;for(int i = 1; i <= n; i ++)for(int j = 1; j <= m; j ++)cin >> w[i][j];for(int k = 2; k <= n + m; k ++)for(int i1 = max(1, k - m); i1 <= n && i1 < k; i1 ++)for(int i2 = max(1, k - m); i2 <= n && i2 < k; i2 ++){int j1 = k - i1, j2 = k - i2;if(j1 >= 1 && j1 <= m && j2 >= 1 && j2 <= m){int t = w[i1][j1];if(i1 != i2) t += w[i2][j2];int &x = f[k][i1][i2];x = max(x, f[k - 1][i1][i2] + t);x = max(x, f[k - 1][i1 - 1][i2] + t);x = max(x, f[k - 1][i1][i2 - 1] + t);x = max(x, f[k - 1][i1 - 1][i2 - 1] + t);}}cout << f[n + m][n][n] << endl;
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);run();return 0;
}

代码思路

  • 定义了二维数组 w 来存储每个位置的好感度值。
  • f[k][i1][i2] 这个三维数组用于记录在特定阶段(即走了 k 步时),从左上角到点 (i1, j1) 和从左上角到点 (i2, j2) (其中 j1 = k - i1j2 = k - i2)两条路径所能获得的最大好感度和。
  • 通过三重循环遍历不同的位置和阶段。对于每个阶段 k 和对应的两个位置 i1i2,计算当前状态下能获得的好感度值,并与之前的状态进行比较更新。具体更新时,考虑从四个可能的方向(上一步是 i1 不变 i2 不变、i1 减 1 i2 不变、i1 不变 i2 减 1、i1 减 1 i2 也减 1)转移过来的情况,取最大值进行更新。
  • 最后输出 f[n + m][n][n],即走完整个矩阵从左上角到右下角且两条路径都到达右下角时的最大好感度和。

改进思路

  • 可以考虑添加一些必要的注释提高代码的可读性。
  • 对于一些重复的代码逻辑,可以考虑提取成函数来提高代码的简洁性和可维护性。

改进代码

#include <iostream>
#include <cstring>
using namespace std;
int w[60][60], f[60*60][60][60];
void updateMax(int k, int i1, int i2, int j1, int j2, int t) {int& x = f[k][i1][i2];x = max(x, f[k - 1][i1][i2] + t);x = max(x, f[k - 1][i1 - 1][i2] + t);x = max(x, f[k - 1][i1][i2 - 1] + t);x = max(x, f[k - 1][i1 - 1][i2 - 1] + t);
}
void run() {int n, m;cin >> n >> m;int a, b, c;for(int i = 1; i <= n; i ++)for(int j = 1; j <= m; j ++)cin >> w[i][j];for(int k = 2; k <= n + m; k ++) {for(int i1 = max(1, k - m); i1 <= n && i1 < k; i1 ++) {for(int i2 = max(1, k - m); i2 <= n && i2 < k; i2 ++) {int j1 = k - i1, j2 = k - i2;if(j1 >= 1 && j1 <= m && j2 >= 1 && j2 <= m) {int t = w[i1][j1];if(i1!= i2) t += w[i2][j2];updateMax(k, i1, i2, j1, j2, t);}}}}cout << f[n + m][n][n] << endl;
}
int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);run();return 0;
}

其它代码

#include <iostream>using namespace std;const int N = 60;int n, m;
int a[N][N];
int f[N * 2][N][N];int main()
{cin >> n >> m;for(int i = 1; i <= n; i ++ )for(int j = 1; j <= m; j ++ )cin >> a[i][j];for(int k = 2; k <= n + m; k ++ )for(int x1 = 1; x1 <= n; x1 ++ )for(int x2 = 1; x2 <= n; x2 ++ ){int y1 = k - x1, y2 = k - x2;int t = a[x1][y1];if(y1 >= 1 && y1 <= m && y2 >= 1 && y2 <= m){if(x1 != x2 || k == 2 || k == n + m){t += a[x2][y2];int &c = f[k][x1][x2];c = max(c, f[k - 1][x1][x2] + t);c = max(c, f[k - 1][x1 - 1][x2] + t);c = max(c, f[k - 1][x1][x2 - 1] + t);c = max(c, f[k - 1][x1 - 1][x2 - 1] + t);}}}cout << f[n + m][n][n] << endl;return 0;
}

代码思路

  • 定义了常量 N 表示矩阵的最大规模。
  • 输入矩阵的行数 n 和列数 m,并读取矩阵元素值到 a 数组。
  • f[k][x1][x2] 这个三维数组用于记录某种状态下的最优值。
  • 通过三重循环遍历不同的阶段(由 k 表示)以及两个位置 x1 和 x2。根据当前的行坐标计算出对应的列坐标 y1 和 y2
  • 只有当两个位置对应的列坐标都在合法范围内时,进行计算。如果满足特定条件(比如两个位置不同或者是边界情况),计算当前的好感度值 t(包含两个位置的元素值),然后更新 f[k][x1][x2] 的值,通过与之前阶段的各种可能情况的最优值进行比较取最大值。
  • 最后输出最终状态下 f[n+m][n][n] 的值。

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

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

相关文章

惯性级惯导的定位漂移估算

一般来说&#xff0c;惯性级陀螺仪指的是0.01度/小时的零偏稳定性&#xff08;是否可以作为等效常值漂移呢&#xff1f;&#xff09;&#xff0c;其定位误差大约为1海里每小时&#xff0c;其具体估算方法可见秦永元老师的《惯性导航》一书中静基座下系统误差传播特性分析一节内…

个人开发笔记

开发笔记 开发常见问题Vue开发中页面flex滚动布局&#xff0c;内容置顶问题功能快捷键 开发常见问题 Vue开发中页面flex滚动布局&#xff0c;内容置顶问题 直接操作路由&#xff1a; const router createRouter({routes: routes,history: createWebHashHistory(),scrollBeha…

该方法通过基于 cv2.VideoCapture 能够获取视频流入(rtmp/rtsp等)实时帧,能够解决由于图像处理速度不够等原因造成帧堆积的问题。

class ThreadedCamera(object): def __init__(self, source0): global cap self.capture cv2.VideoCapture(source) self.thread Thread(targetself.update, args()) self.thread.daemon True # 防止主线程挂掉&#xff0c;子线变成…

在Ubuntu 14.04上如何导入和导出MongoDB数据库

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 MongoDB 是最流行的 NoSQL 数据库引擎之一。它以可扩展、强大、可靠和易于使用而闻名。在本文中&#xff0c;我们将向您展示如何导入和导…

IBM Spectrum LSF Data Manager,独立于群集工作负载进行数据传输管理,以提高吞吐量并优化计算资源的使用

IBM Spectrum LSF Data Manager,独立于群集工作负载进行数据传输管理&#xff0c;以提高吞吐量并优化计算资源的使用 亮点 ● 独立于群集工作负载管理数据传输&#xff0c;提高吞吐量&#xff0c;优化计算资源的使用&#xff1b; ● 利用智能托管缓存消除重复数据传输&#xf…

【龙晰 离线安装openssl-devel】openssl-devel rpm 离线安装 需要下载哪些安rpm 包

进入龙晰镜像源地址下载 http://mirrors.openanolis.cn/anolis/8/BaseOS/x86_64/os/Packages/(base) [rootAI lib64]# yum install openssl-devel Last metadata expiration check: 14:03:32 ago on Fri 21 Jun 2024 07:26:56 AM CST. Dependencies resolved. Package …

公交车安全监控的智能化革新:4G车载视频监控与GPS卫星定位技术的融合

随着科技的快速发展&#xff0c;智能化监控技术在交通管理领域的应用日益广泛。特别是对于公交车这类公共交通工具&#xff0c;其安全监控的智能化、实时化、全面化显得尤为重要。综合运用最新的4G车载视频监控技术及GPS卫星定位技术&#xff0c;对公交车进行全方位、立体化、智…

北邮《计算机网络》英文选择题课堂小测

课堂小测验及答疑汇总 2020年 5 月 12 日 Q1. Which is the network address after aggregation of following 3 networks: 200.2.50.0/23&#xff0c; 200.2.52.0/22 and 200.2.56.0/22? A. 200.2.48.0/20 B. 200.2.50.0/20 C. 200.2.48.0/21 D. 200.2.50.0/21 Answer: A Q…

MySQL索引优化解决方案--索引测试--explain(2)

索引测试 通过存储过程往数据库中插入300w 条数据分别测试使用索引和没有使用索引的情况下&#xff0c;where 查询的一个效率对比。 -- 创建表 DROP TABLE IF EXISTS person; CREATE TABLE person( PID int(11) auto_increment comment 编号, PNAME varchar(50) comment 姓名…

正则表达式以及文本三剑客grep、sed、awk

正则表达式匹配的是文本内容&#xff0c;文本三剑客都是针对文本内容。 grep&#xff1a;过滤文本内容 sed&#xff1a;针对文本内容进行增删改查 awk&#xff1a;按行取列 一、grep grep的作用使用正则表达式来匹配文本内容 1、grep选项 -m&#xff1a;匹配几次之后停止…

【论文解读】通过多标记预测建立更好更快的大型语言模型

Meta 的这篇多标记预测论文显示,与当前的下一标记预测器相比,多头预测器内存效率高、性能更好、训练速度更快。 https://arxiv.org/pdf/2404.19737 主要收获: 多标记预测是对 LLM 训练的一种简单而强大的修改,可提高样本效率和各种任务的性能。这种方法在大规模应用中尤为…

从 Hadoop 迁移,无需淘汰和替换

我们仍然惊讶于有如此多的客户来找我们&#xff0c;希望从HDFS迁移到现代对象存储&#xff0c;如MinIO。我们现在以为每个人都已经完成了过渡&#xff0c;但每周&#xff0c;我们都会与一个决定进行过渡的主要、高技术性组织交谈。 很多时候&#xff0c;在这些讨论中&#xff…

安卓 jetpack compose

以下是 Jetpack Compose 中常用的一些组件的列表&#xff1a; 组件名称描述Text用于显示文本内容。Button可点击的按钮组件&#xff0c;常用于触发事件。TextField用于输入文本的文本框组件。Image用于展示图片。Column垂直布局容器&#xff0c;可以在其中垂直排列子组件。Row…

Mac环境 aab包转apks,并安装apks

一、下载下载bundletool工具 Releases google/bundletool GitHub 二、将下载bundletool.jar包、aab、keystore文件全部放到同一个目录下 例如我全部放到download目录下 转换命令行&#xff1a; java -jar bundletool-all-1.16.0.jar build-apks --modeuniversal --bundle…

java运维交接项目逆向工程

​ 背景 有承接过Java项目运维的团队估计都处理过的一件事情&#xff0c;就是同步生产代码跟本地代码&#xff0c;条件再差些甚至要直接基于生产部署包逆向本地源码工程。而哪怕是原运维团队交接了源码&#xff0c;往往也会历史久远的原因&#xff0c;给了一份不太可靠的源码…

MySQL连接

MySQL工具包 MySQL实现简单链接 一 引入工具包 JBDCUtils&#xff0c;无需更改&#xff0c;直接使用即可。 import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Properties;public class JDBCUtil {private static String URL;p…

基于PHP+MySQL组合开发的在线客服小程序源码系统 带完整的安装代码包以及搭建教程

系统概述 源码系统是专门为满足企业在线客服需求而设计的&#xff0c;它集成了多种功能&#xff0c;能够帮助企业实现与用户的实时沟通、问题解答、信息反馈等。通过该系统&#xff0c;企业可以更好地了解用户需求&#xff0c;提升用户体验&#xff0c;增强用户对企业的信任感…

Java面试题:解释观察者模式的工作原理,并通过实例展示如何在Java中实现

观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时&#xff0c;它的所有依赖者&#xff08;观察者&#xff09;都会收到通知并自动更…

Linux[高级管理]——Squid代理服务器的部署和应用(传统模式详解)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月24日11点11分 &#x1f004;️文章质量&#xff1a;95分 目录 ————前言———— Squid功能 Squ…

LabelEncoder 类属性类方法及用法

类 LabelEncoder类属性及类方法示例用法用于大型数据集 类 LabelEncoder LabelEncoder 是 scikit-learn 中的一个预处理工具&#xff0c;用于将类别变量&#xff08;例如字符串标签或离散的整数标签&#xff09;转换为整数。 类 LabelEncoder 在包 sklearn.preprocessing.Lab…