动态规划数字三角形模型——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;其具体估算方法可见秦永元老师的《惯性导航》一书中静基座下系统误差传播特性分析一节内…

【龙晰 离线安装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;对公交车进行全方位、立体化、智…

正则表达式以及文本三剑客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…

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;增强用户对企业的信任感…

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

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

【JavaEE精炼宝库】多线程进阶(1)常见锁策略 | CAS | ABA问题

目录 一、常见的锁策略&#xff1a; 1.1 悲观锁 | 乐观锁&#xff1a; 1.2 重量级锁 | 轻量级锁&#xff1a; 1.3 自旋锁 | 挂起等待锁&#xff1a; 1.4 公平锁 | 非公平锁&#xff1a; 1.5 可重入锁 | 不可重入锁&#xff1a; 1.6 互斥锁 | 读写锁&#xff1a; 1.7 面…

Spring Boot 集成 MinIO 实现文件上传

Spring Boot 集成 MinIO 实现文件上传 一、 Minio 服务准备 MinIO的搭建过程参考 Docker 搭建 MinIO 对象存储。 登录MinIO控制台&#xff0c;新建一个 Bucket&#xff0c;修改 Bucket 权限为公开。 二、MinIO 集成 添加 MinIO 依赖 <!-- https://mvnrepository.com/ar…

【工具测评】ONLYOFFICE——你的下一款桌面编辑器

文章目录 前言一、安装1.1 跳转官网下载安装包1.2 安装步骤 二、功能介绍2.1 功能全面的 PDF 编辑器2.2 PDF 表单2.3 文本文档编辑器的更新2.4 电子表格编辑器的更新2.5 演示文稿编辑器有哪些更新2.6 所有编辑器中的改进内容2.7 从右至左显示 & 新的本地化选项2.8 可用性提…

重生奇迹MU整理装备技巧

除了注意一些基本的事项外&#xff0c;还有一些技巧可以帮助我们更快更好地整理装备&#xff0c;提升自己在游戏中的表现。 1. 理性地管理装备是取得胜利的关键。在整理装备时&#xff0c;根据不同的属性和需求&#xff0c;可以将装备分类&#xff0c;比如攻击型、防御型、辅助…

CRMEB 多门店后台登录入口地址修改(默认admin)

一、>2.4版本 1、修改后端 config/admin.php 配置文件,为自定义的后缀 2、修改 平台后台前端源码中 view/admin/src/settings.js 文件,修改为和上面一样的配置 3、修改后重新打包前端代码,并且覆盖到后端的 public 目录下&#xff1a;打包方法 4、重启swoole 二、<2.4版…

云函数-uniapp + uniCloud 订阅消息实战教程(二)

一、创建uniCloud项目 在 HBuilderX 新建项目界面&#xff0c;选择 uni-app项目&#xff0c;输入项目名称&#xff0c;选择默认模板即可&#xff0c;根据个人需要选择 vue版本&#xff0c;并勾选 启用uniCloud&#xff0c;在右侧选择服务供应商&#xff08;支付宝云、阿里云、…

再不挖掘就晚了!本周三分之二二区以上 | GBD数据库周报(6.12~6.18)

全球疾病负担&#xff08;GBD&#xff09;是迄今为止规模最大、最全面的一项研究&#xff0c;旨在量化不同地区和不同时期的健康损失&#xff0c;从而改善卫生系统并消除差异。 该研究由华盛顿大学健康指标与评估研究所 (IHME) 牵头&#xff0c;是一项真正的全球性研究&#xf…

Tensorflow入门实战 T06-Vgg16 明星识别

目录 1、前言 2、 完整代码 3、运行过程结果 4、遇到的问题 5、小结 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 1、前言 这周主要是使用VGG16模型&#xff0c;完成明星照片识别。 2、 完整代…

奇点临近:人类与智能时代的未来

在信息爆炸的时代&#xff0c;我们每天都被海量的信息所淹没&#xff0c;如何才能在这个嘈杂的世界中找到真正有价值的信息&#xff1f;如何才能利用信息的力量&#xff0c;提升我们的认知水平&#xff0c;重塑我们的未来&#xff1f; 这些问题的答案&#xff0c;或许都能在雷…