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

news2024/11/16 9:52:36

动态规划数字三角形模型

定义

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

运用情况

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

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

注意事项

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

解题思路

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

例如,在一个更复杂的数字三角形中,除了数字本身,每个位置还有一个权重,要求在权重限制下找到最大和。这时状态可能需要扩展为 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.coloradmin.cn/o/1860897.html

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

相关文章

研究上百个小时,高手总结了这份 DALL-E 3 人物连续性公式(下)

根据前两篇学习&#xff0c;如何创建人物连续性公式&#xff0c;或多或少都会联想到 Midjourney 里面的 Seed 值&#xff0c;是否能运用到 Dall e3 里面&#xff0c;那么今天这篇文章更新来了&#xff01;&#xff01; 继续感谢这位伟大的作者&#xff1a;AshutoshShrivastava…

五大基于Cesium的开源框架及其优劣势,一文导读。

2024-03-12 10:49贝格前端工场 OpenGL基础上有了webGL&#xff0c;webGL基础上有了Cesium&#xff0c;Cesium基础上有了N多开源框架&#xff0c;本文带大家看一下。 1. CesiumJS CesiumJS 是 Cesium 引擎的核心框架&#xff0c;提供了丰富的 API 和组件&#xff0c;用于构建…

基于Java微信小程序校园订餐系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

大模型训练十大戒律!!

1.切勿微调&#xff08;Thou Shalt Not Fine-Tune&#xff09;&#xff1a;尽量写prompt&#xff0c;利用大模型本身的能力zeroshot&#xff0c;必要时辅以少量样本&#xff08;few-shot examples&#xff09;或检索增强生成&#xff08;RAG&#xff09;。微调成本高、速度慢且…

如何在web页面下做自动化测试?

自动化测试是在软件开发中非常重要的一环&#xff0c;它可以提高测试效率并减少错误率。在web页面下进行自动化测试&#xff0c;可以帮助我们验证网页的功能和交互&#xff0c;并确保它们在不同浏览器和平台上的一致性。本文将从零开始&#xff0c;详细介绍如何在web页面下进行…

充电宝哪个牌子最好最耐用?耐用西圣、罗马仕、绿联充电宝实测

目前充电宝是我们出行必备的“能量伴侣”。然而&#xff0c;市面上充电宝品牌繁多&#xff0c;让人眼花缭乱&#xff0c;究竟哪个牌子最好最耐用呢&#xff1f;为了给大家找到答案&#xff0c;我们精心挑选了西圣、罗马仕和绿联这三个备受关注的品牌&#xff0c;并对它们的充电…

小米6款手机霸榜618 Top20,看安卓巨头如何撼动苹果地位

618购物节&#xff0c;作为中国电商领域的一大盛事&#xff0c;每年都会吸引无数消费者的眼球。在这场购物狂欢中&#xff0c;智能手机市场的竞争尤为激烈。 今年618&#xff0c;小米以6款手机上榜累计销量TOP20&#xff0c;超越了苹果的5款&#xff0c;成为上榜机型最多的品牌…

74. UE5 RPG 搭建场景设置光照和纹理流送

前面&#xff0c;我们对角色和敌人进行了一些完善。在这一篇文章里面&#xff0c;我们将进行对场景进行搭建&#xff0c;并对场景的光照和场景的后处理进行设置。 创建新场景 选择新建关卡 接着选择将关卡另存为 选择一个合理的位置 我们将场景内的网格地面删除掉&#xf…

如何提高测试管理的效率和一致性?

TestComplete 是一款自动化UI测试工具&#xff0c;这款工具目前在全球范围内被广泛应用于进行桌面、移动和Web应用的自动化测试。 TestComplete 集成了一种精心设计的自动化引擎&#xff0c;可以自动记录和回放用户的操作&#xff0c;方便用户进行UI&#xff08;用户界面&…

什么是 Linux 内核,其功能是什么?

inux内核是Linux操作系统的核心组件&#xff0c;负责管理系统的硬件资源&#xff0c;并为应用程序提供基本的操作系统服务。刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后…

服务器神秘挂起:一场惊心动魄的内核探案

2024年6月17日&#xff0c;我们的运维团队突然收到了一连串的告警。监控大屏上&#xff0c;代表着不同 Sealos 可用区的绿点中&#xff0c;零星地闪烁起了一两个红点。 “奇怪&#xff0c;怎么有几台服务器突然 hang 住了&#xff1f;” 值班的小辉皱起了眉头。 这次故障的诡…

能运行的Bug就别动它了...程序员老梗图什么时候看见才能不笑啊

说到程序员&#xff0c;那可是外界眼中自带光环的生物——掌控代码的大神&#xff0c;改变世界的王者&#xff01; 然而&#xff0c;现实却是“甲方虐我千百遍&#xff0c;我待bug如初恋”。活多钱少压力大&#xff0c;程序员们只能踏上了自黑、自嘲的不归路&#xff0c;毕竟&…

记录一个前端axios传参格式的问题

今天改造一个其他系统的页面&#xff0c;直接把原来系统的接口拿过来复用&#xff0c;发现怎么传参都报400&#xff0c;地址参数都一样&#xff0c;怎么就报错了呢&#xff0c;报错原因大概是后台无法解析出参数&#xff08;后台属于其他平台&#xff0c;无法测试&#xff09;。…

Spring Boot配置Springdoc

刚刚开通了一个公众号&#xff0c;会分享一些技术博客和自己觉得比较好的项目&#xff0c;同时会更新一些自己使用的工具和图书资料&#xff0c;后面会整理一些面试资料进行分享&#xff0c;觉得有兴趣的可以关注一下。 问题描述 之前文章有提到Spring Boot切换到Springdoc&a…

CAD随机球体插件 专业版

插件介绍 CAD随机球体插件专业版可用于在AutoCAD内建立随机分布的球体三维模型。 模型说明 模型尺寸中长度、宽度、高度&#xff1a;设定随机球体生成的长方体区域&#xff0c;及生成的长方体部件尺寸。 建模控制中球体内包参数为限定球体是否会穿过模型的边界。当球体内…

标准立项 | 湖库沉积物微生物多样性监测规程

饮用水水源地保护是饮用水安全保障中最重要的一个环节&#xff0c;其水质状况直接关系到供水区人民群众的身体健康。我国水资源存在水质差、资源短缺、资源时间空间分布不合理等问题。而近些年由水源地污染引发的饮用水安全事件&#xff0c;给居民的生产生活造成一定程度的影响…

【网络安全的神秘世界】解决dvwa靶场报错:Illegal mix of collations for operation ‘UNION‘

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 &#x1f6a9;问题描述 当尝试执行如下 SQL 语句时&#xff1a; 1 union select schema_name,1 from information_schema.s…

[数据集][目标检测]鸡蛋缺陷检测数据集VOC+YOLO格式2918张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2918 标注数量(xml文件个数)&#xff1a;2918 标注数量(txt文件个数)&#xff1a;2918 标注…

【Linux】使用chrony同步时间

chrony介绍 chrony 是一个开源的网络时间协议 (NTP) 客户端和服务器&#xff0c;旨在保持计算机系统的时间精确同步。它是Linux和其他类Unix系统中广泛使用的工具&#xff0c;特别是在需要高精度时间同步的环境中。chrony 的设计考虑了现代网络的挑战&#xff0c;如不稳定的连…

性能评测系列(PT-010):Spring Boot + MySQL,高并发insert

一、测试概述 测试场景 场景编号&#xff1a; PT-010场景描述&#xff1a; Java应用&#xff0c;MySQL单表写测试目的&#xff1a;指定规格、配置、环境下&#xff0c;Java应用数据库简单写场景负载能力评估。&#xff08;不含调优&#xff0c;所测结果未必是最优结果&#x…