动态规划DP 数字三角型模型 方格取数(题目详解+C++代码实现)

方格取数

原题链接

AcWing 1027. 方格取数

题目描述

设有 N×N 的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。
如下图所示:
2.gif
某人从图中的左上角 A 出发,可以向下行走,也可以向右行走,直到到达右下角的 B 点。
在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。
此人从 A 点到 B 点共走了两次,试找出两条这样的路径,使得取得的数字和为最大

输入格式
第一行为一个整数N,表示 N×N 的方格图。
接下来的每行有三个整数,第一个为行号数,第二个为列号数,第三个为在该行、该列上所放的数。
行和列编号从 1开始。
一行“0 0 0”表示结束。

输出格式
输出一个整数,表示两条路径上取得的最大的和。

数据范围
N≤10

输入样例:

8
2 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
6 3 15
7 2 14
0 0 0

输出样例:

67

题目分析

摘花生 类似,不同点在于该题方格取数要找出两条路径,使其和最大
回忆 摘花生 动态规划数字三角形模型思考。

摘花生(只走一次):
f [ i , j ] f[i,j] f[i,j] 表示左右从 ( 1 , 1 ) (1,1) (1,1) 走到 ( i , j ) (i,j) (i,j) 的路径的最大值
f [ i , j ] = m a x ( f [ i − 1 , j ] + w [ i ] [ j ] , f [ i , j − 1 ] + w [ i , j ] ) f[i,j]=max(f[i-1,j]+w[i][j],f[i,j-1]+w[i,j]) f[i,j]=max(f[i1,j]+w[i][j],f[i,j1]+w[i,j])

方格取数(走两次):
利用摘花生的思想,同时维护两条路径,用 f [ i 1 , j 1 , i 2 , j 2 ] f[i1,j1,i2,j2] f[i1,j1,i2,j2] 表示所有从 ( 1 , 1 ) , ( 1 , 1 ) (1,1), (1,1) (1,1),(1,1) 分别走到 ( i 1 , j 1 ) , ( i 2 , j 2 ) (i1,j1), (i2,j2) (i1,j1),(i2,j2) 的路径的最大值。

同时,每走一格,要么是 i + 1 i+1 i+1,要么是 j + 1 j+1 j+1,并且由于是同时出发的两条路径,则一定满足** i 1 + j 1 = i 2 + j 2 i1+j1=i2+j2 i1+j1=i2+j2** 。据此,我们可以化简状态 f [ i 1 , j 1 , i 2 , j 2 ] f[i1,j1,i2,j2] f[i1,j1,i2,j2],令 k = i 1 + j 1 = i 2 + j 2 k=i1+j1=i2+j2 k=i1+j1=i2+j2 ,表示两条路径走到的格子的横纵坐标之和
f [ k , i 1 , i 2 ] f[k,i1,i2] f[k,i1,i2] 表示所有从 ( 1 , 1 ) , ( 1 , 1 ) (1,1), (1,1) (1,1),(1,1) 分别走到 ( i 1 , k − i 1 ) , ( i 2 , k − i 2 ) (i1,k-i1), (i2,k-i2) (i1,ki1),(i2,ki2) 的路径的最大值。

但需要注意的是,当两条路径走到同一个格子时,一个方格中的数字只能被取一次,则如何处理“同一个格子不能被重复选择”?
我们知道,只有在 i 1 + j 1 = i 2 + j 2 i1+j1=i2+j2 i1+j1=i2+j2 时,两条路径的格子才可能重合。即为在同一个 k k k 下,同时满足 i 1 = i 2 i1=i2 i1=i2 时,两条路径的格子重合。此时,该方格内的数字只被加一次

状态计算

t t t 表示下一步需要取的数字之和,
若两条路径不重合,则 t = w [ i 1 ] [ j 1 ] + w [ i 2 ] [ j 2 ] t=w[i1][j1]+w[i2][j2] t=w[i1][j1]+w[i2][j2]
若两条路径重合,则 t = w [ i 1 ] [ j 1 ] t=w[i1][j1] t=w[i1][j1](只用加一次)。

状态的转移计算示意图如下:
路径从左至右:则由 i − 1 i-1 i1 i i i,由 k − 1 k-1 k1 k k k
路径从上至下:则 i i i 不变,由 k − 1 k-1 k1 k k k
在这里插入图片描述

第一条路径:从左至右;第二条路径:从左至右:
f [ k ] [ i 1 ] [ i 2 ] = m a x ( f [ k ] [ i 1 ] [ i 2 ] , f [ k − 1 ] [ i 1 − 1 ] [ i 2 − 1 ] + t ) f[k][i1][i2]=max(f[k][i1][i2], f[k-1][i1-1][i2-1]+t) f[k][i1][i2]=max(f[k][i1][i2],f[k1][i11][i21]+t)
第一条路径:从左至右;第二条路径:从上至下:
f [ k ] [ i 1 ] [ i 2 ] = m a x ( f [ k ] [ i 1 ] [ i 2 ] , f [ k − 1 ] [ i 1 − 1 ] [ i 2 ] + t ) f[k][i1][i2]=max(f[k][i1][i2], f[k-1][i1-1][i2]+t) f[k][i1][i2]=max(f[k][i1][i2],f[k1][i11][i2]+t)
第一条路径:从上至下;第二条路径:从上至下:
f [ k ] [ i 1 ] [ i 2 ] = m a x ( f [ k ] [ i 1 ] [ i 2 ] , f [ k − 1 ] [ i 1 ] [ i 2 ] + t ) f[k][i1][i2]=max(f[k][i1][i2], f[k-1][i1][i2]+t) f[k][i1][i2]=max(f[k][i1][i2],f[k1][i1][i2]+t)
第一条路径:从上至下;第二条路径:从左至右:
f [ k ] [ i 1 ] [ i 2 ] = m a x ( f [ k ] [ i 1 ] [ i 2 ] , f [ k − 1 ] [ i 1 ] [ i 2 − 1 ] + t ) f[k][i1][i2]=max(f[k][i1][i2], f[k-1][i1][i2-1]+t) f[k][i1][i2]=max(f[k][i1][i2],f[k1][i1][i21]+t)

完整代码

#include <iostream>
#include <algorithm>
using namespace std;
const int N=15;
int n;
int w[N][N];  //权重
int f[N*2][N][N];  //状态计算
int main(){
    scanf("%d",&n);
    int a,b,c;
    while(cin>>a>>b>>c,a||b||c) w[a][b]=c;
    for(int k=2;k<=n+n;k++){
        for(int i1=1;i1<=n;i1++){
            for(int i2=1;i2<=n;i2++){
                int j1=k-i1,j2=k-i2;
                if(j1>=1&&j1<=n&&j2>=1&&j2<=n){  //j符合条件
                    int t=w[i1][j1];  //第一条路径
                    if(i1!=i2) t+=w[i2][j2];  //如果第二条路径与第一条路径重合,则权重w[i][j]不能重复增加
                    int &x=f[k][i1][i2];  //使用&简化代码
                    x=max(x,f[k-1][i1-1][i2-1]+t);  //第一条路径:来自上方;第二条路径:来自上方
                    x=max(x,f[k-1][i1-1][i2]+t);  //第一条路径:来自上方;第二条路径:来自左方
                    x=max(x,f[k-1][i1][i2]+t);  //第一条路径:来自左方;第二条路径:来自左方
                    x=max(x,f[k-1][i1][i2-1]+t);  //第一条路径:来自左方;第二条路径:来自上方
                }
            }
        }
    }
    printf("%d\n",f[n+n][n][n]);
    return 0;
}

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

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

相关文章

【Linux】20.基础IO(2)

文章目录 2. 理解文件系统2.1 inode2.2 如何理解目录2.3 硬链接2.4 软链接2.5 硬链接和软链接的区别 2. 理解文件系统 2.1 inode 我们使用ls -l的时候看到的除了看到文件名&#xff0c;还看到了文件元数据。 ydk_108iZuf68hz06p6s2809gl3i1Z:~/108/lesson20$ ll total 8 drw…

read+write实现:链表放到文件+文件数据放到链表 的功能

思路 一、 定义链表&#xff1a; 1 节点结构&#xff08;数据int型&#xff09; 2 链表操作&#xff08;创建节点、插入节点、释放链表、打印链表&#xff09;。 二、链表保存到文件 1打开文件 2遍历链表、写文件&#xff1a; 遍历链表,write()将节点数据写入文件。…

图漾相机-ROS2-SDK-Ubuntu版本编译(新版本)

官网编译文档链接&#xff1a; https://doc.percipio.xyz/cam/latest/getstarted/sdk-ros2-compile.html 国内gitee下载SDK链接&#xff1a; https://gitee.com/percipioxyz 国外github下载SDK链接&#xff1a; https://github.com/percipioxyz 1.Camport ROS2 SDK 介绍 1.1 …

C# 添加、替换、提取、或删除Excel中的图片

在Excel中插入与数据相关的图片&#xff0c;能将关键数据或信息以更直观的方式呈现出来&#xff0c;使文档更加美观。此外&#xff0c;对于已有图片&#xff0c;你有事可能需要更新图片以确保信息的准确性&#xff0c;或者将Excel 中的图片单独保存&#xff0c;用于资料归档、备…

智能风控 数据分析 groupby、apply、reset_index组合拳

目录 groupby——分组 本例 apply——对每个分组应用一个函数 等价用法 reset_index——重置索引 使用前​编辑 注意事项 groupby必须配合聚合函数、 关于agglist 一些groupby试验 1. groupby对象之后。sum&#xff08;一个列名&#xff09; 2. groupby对象…

浅析百度AOI数据与高德AOI数据的差异性

目录 前言 一、AOI属性数据 1、百度AOI数据 2、高德AOI数据 二、AOI矢量边界 1、百度AOI空间范围 2、高德AOI空间范围 三、数据获取频次和难易程度 1、接口限制 2、数据转换成本 四、总结 前言 在当今数字化时代&#xff0c;地理信息数据的精准性和丰富性对于城市规划…

通过亚马逊云科技Bedrock打造自定义AI智能体Agent(上)

大家对于智能体代理Agent一定已经非常熟悉&#xff0c;自主代理&#xff08;Autonomous Agents&#xff09; 目前在AI行业极其热门并具有巨大的潜力&#xff0c;能够显著提升开发者日常的工作效率、自动化日常琐碎、重复性任务&#xff0c;并生成全新的内容。Agent可以理解用户…

汇编的使用总结

一、汇编的组成 1、汇编指令&#xff08;指令集&#xff09; 数据处理指令: 数据搬移指令 数据移位指令 位运算指令 算术运算指令 比较指令 跳转指令 内存读写指令 状态寄存器传送指令 异常产生指令等 2、伪指令 不是汇编指令&#xff0c;但是可以起到指令的作用&#xff0c;伪…

S4 HANA定义税码(FTXP)

本文主要介绍在S4 HANA OP中S4 HANA定义税码相关设置。具体请参照如下内容&#xff1a; 定义税码(FTXP) 以上界面是根据国家的“定价过程”确定的。蓝色的行项目表示目前已经激活的行项目。 不可抵扣进项税一般用于采购业务中&#xff0c;因此用在进项税码中。 消费税和营业…

Git进阶笔记系列(01)Git核心架构原理 | 常用命令实战集合

读书笔记&#xff1a;卓越强迫症强大恐惧症&#xff0c;在亲子家庭、职场关系里尤其是纵向关系模型里&#xff0c;这两种状态很容易无缝衔接。尤其父母对子女、领导对下属&#xff0c;都有望子成龙、强将无弱兵的期望&#xff0c;然而在你的面前&#xff0c;他们才是永远强大的…

多级缓存(亿级并发解决方案)

多级缓存&#xff08;亿级流量&#xff08;并发&#xff09;的缓存方案&#xff09; 传统缓存的问题 传统缓存是请求到达tomcat后&#xff0c;先查询redis&#xff0c;如果未命中则查询数据库&#xff0c;问题如下&#xff1a; &#xff08;1&#xff09;请求要经过tomcat处…

场景设计学习-积分系统

场景设计-积分系统 1.概念和规则 积分&#xff1a;用户在网站的各种交互行为都可以产生积分&#xff0c;积分值与行为类型有关天梯榜&#xff1a;按照每个用户的总积分排序得到的排行榜&#xff0c;称为天梯榜。排名靠前的有奖励。天梯榜每个自然月为一个赛季&#xff0c;月初…

ML基础3-sklearn中的1个简单的分类器例子

Scikit-learn&#xff08;通常缩写为sklearn&#xff09;是一个流行的Python机器学习库&#xff0c;用于数据挖掘和数据分析任务。它建立在NumPy、SciPy和matplotlib等科学计算/可视化库的基础上&#xff0c;提供了丰富的工具和算法&#xff0c;用于处理各种机器学习问题&#…

The Simulation技术浅析(二):模型技术

一、物理模型(Physical Models) 1. 概述 物理模型基于物理定律和原理,通过模拟现实世界中物理系统的行为和相互作用来构建模型。物理模型通常用于工程、物理和化学等领域,用于预测系统在不同条件下的表现。 2. 关键技术 力学定律:例如牛顿运动定律,用于模拟物体的运动…

006 mybatis关联查询(一对一、一对多)

文章目录 一对一查询SQL语句方法一&#xff1a;resultType方法二&#xff1a;resultMap创建扩展po类Mapper映射文件Mapper接口测试代码小结 一对多查询SQL语句修改po类Mapper映射文件Mapper接口测试代码 注意&#xff1a;因为一个订单信息只会是一个人下的订单&#xff0c;所以…

linux asio网络编程理论及实现

最近在B站看了恋恋风辰大佬的asio网络编程&#xff0c;质量非常高。在本章中将对ASIO异步网络编程的整体及一些实现细节进行完整的梳理&#xff0c;用于复习与分享。大佬的博客&#xff1a;恋恋风辰官方博客 Preactor/Reactor模式 在网络编程中&#xff0c;通常根据事件处理的触…

渗透测试之WAF规则触发绕过规则之规则库绕过方式

目录 Waf触发规则的绕过 特殊字符替换空格 实例 特殊字符拼接绕过waf Mysql 内置得方法 注释包含关键字 实例 Waf触发规则的绕过 特殊字符替换空格 用一些特殊字符代替空格&#xff0c;比如在mysql中%0a是换行&#xff0c;可以代替空格 这个方法也可以部分绕过最新版本的…

环境搭建--vscode

vscode官网下载合适版本 安装vscode插件 安装 MinGW 配置环境变量 把安装目录D&#xff1a;\mingw64 配置在用户的环境变量path里即可 选择用户环境变量path 点确定保存后开启cmd输入g&#xff0c;如提示no input files 则说明Mingw64 安装成功&#xff0c;如果提示g 不是内…

橙河网络:市场调研都会用到哪些工具?

一般市场调研会用到多种工具&#xff0c;以获取全面、准确的市场信息。以下是一些常用的市场调研工具&#xff1a; 一、在线调查平台 问卷星&#xff1a;提供在线问卷编制、分发和数据分析功能&#xff0c;适用于大规模的市场调研。 SurveyMonkey&#xff1a;可用于市场调查…

996引擎 - NPC-添加NPC引擎自带形象

996引擎 - NPC-添加NPC引擎自带形象 截图参考添加NPC参考资料截图参考 添加NPC 编辑NPC表:Envir\DATA\cfg_npclist.xls 1.1. 需要临时隐藏NPC时可以在id前加 // 1.2. 如果NPC朝向不对,可以调整dir 列。(按8方向,上是0顺时针数。我这里给的4) 1.3. 形象代码:NPC代码、怪物…