笔记---dp---数字三角形模型

所谓数字三角形模型,即是从数字三角形这一题衍生出来的

题目为经典题目,不再赘述,此笔记根据AcWing算法提高课来进行对数字三角形模型衍生例题的记录

题目关系如下(见AcWing里的AcSaber):

在这里插入图片描述

AcWing.1015.摘花生

Hello Kitty想摘点花生送给她喜欢的米老鼠。

她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。

地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。

Hello Kitty只能向东或向南走,不能向西或向北走。

问Hello Kitty最多能够摘到多少颗花生。
在这里插入图片描述
输入格式
第一行是一个整数 T T T,代表一共有多少组数据。
接下来是 T T T组数据。
每组数据的第一行是两个整数,分别代表花生苗的行数 R R R 和列数 C C C
每组数据的接下来 R R R 行数据,从北向南依次描述每行花生苗的情况。每行数据有 C C C 个整数,按从西向东的顺序描述了该行每株花生苗上的花生数目 M M M

输出格式
对每组输入数据,输出一行,内容为Hello Kitty能摘到得最多的花生颗数。

数据范围
1 ≤ T ≤ 100 , 1≤T≤100, 1T100,
1 ≤ R , C ≤ 100 , 1≤R,C≤100, 1R,C100,
0 ≤ M ≤ 1000 0≤M≤1000 0M1000

输入样例:

2
2 2
1 1
3 4
2 3
2 3 4
1 6 5

输出样例:

8
16

对于此题,使用 f [ i ] [ j ] f[i][j] f[i][j]来表示从 ( 1 , 1 ) (1,1) (1,1)走到 ( i , j ) (i,j) (i,j)所有可能的路线中,能够得到的花生的最大值,那么到最后,我们要求的最大值就是右下角的 f [ r ] [ c ] f[r][c] f[r][c]

接下来需要思考如何划分上面这个集合,也就是如何算出每个 f [ i ] [ j ] f[i][j] f[i][j]

非常常用的集合划分依据:最后一步

看最后一步,由题意知,最后一步,要么是从上面走下来 ( f [ i − 1 ] [ j ] ) (f[i-1][j]) (f[i1][j]),要么就是从左面过来 ( f [ i ] [ j − 1 ] ) (f[i][j-1]) (f[i][j1])
那么易得:状态转移方程为 f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j ] + a [ i ] [ j ] , f [ i ] [ j − 1 ] + a [ i ] [ j ] ) f[i][j] = max(f[i-1][j] + a[i][j],f[i][j-1] + a[i][j]) f[i][j]=max(f[i1][j]+a[i][j]f[i][j1]+a[i][j])

代码:

#include<iostream>
using namespace std;const int N = 110;int g[N][N];
int f[N][N];
int r, c;int main() {int t; cin >> t;while (t--) {cin >> r >> c;for (int i = 1; i <= r; i++) {for (int j = 1; j <= c; j++) {cin >> g[i][j];}}for (int i = 1; i <= r; i++) {for (int j = 1; j <= c; j++) {f[i][j] = max(f[i - 1][j] + g[i][j], f[i][j - 1] + g[i][j]);}}cout << f[r][c] << endl;}return 0;
}

类似题目:P1002 [NOIP2002 普及组] 过河卒

AcWing.1018.最低通行费

个商人穿过一个 N×N 的正方形的网格,去参加一个非常重要的商务活动。

他要从网格的左上角进,右下角出。

每穿越中间 1 1 1 个小方格,都要花费 1 1 1 个单位时间。

商人必须在 ( 2 N − 1 ) (2N−1) (2N1) 个单位时间穿越出去。

而在经过中间的每个小方格时,都需要缴纳一定的费用。

这个商人期望在规定时间内用最少费用穿越出去。

请问至少需要多少费用?

注意:不能对角穿越各个小方格(即,只能向上下左右四个方向移动且不能离开网格)。

输入格式
第一行是一个整数,表示正方形的宽度 N N N

后面 N N N 行,每行 N N N 个不大于 100 100 100 的正整数,为网格上每个小方格的费用。

输出格式
输出一个整数,表示至少需要的费用。

数据范围
1 ≤ N ≤ 100 1≤N≤100 1N100

输入样例:

5
1  4  6  8  10
2  5  7  15 17
6  8  9  18 20
10 11 12 19 21
20 23 25 29 33

输出样例:

109

样例解释
样例中,最小值为 109 = 1 + 2 + 5 + 7 + 9 + 12 + 19 + 21 + 33 。 109=1+2+5+7+9+12+19+21+33。 109=1+2+5+7+9+12+19+21+33

此题中的重要信息为花费时间不能超过 ( 2 N − 1 ) (2N-1) (2N1),即不能走回头路,只能和上一题一样往下走或者往右走
注意此题取最小值,所以需要注意边界问题。

从左上角进入后,在状态转移的时候,可能会去到边界之外的0,故我们需要在过程中进行特判。

代码:

#include<iostream>
using namespace std;
const int N = 110;int g[N][N];
int f[N][N];
int n;int main() {cin >> n;for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)cin >> g[i][j];for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)if (i == 1 && j == 1)f[i][j] = g[i][j];		//第一个点就是g[1][1]else {f[i][j] = 0x3f3f3f3f;//因为如果在边上,可能会取到没有初始化过的值为0的地方,故直接特判来状态转移//如果不是第一行if (i > 1)f[i][j] = min(f[i][j], f[i - 1][j] + g[i][j]);//如果不是第一列if (j > 1)f[i][j] = min(f[i][j], f[i][j - 1] + g[i][j]);}cout << f[n][n];return 0;
}

AcWing.1027.方格取数

设有 N × N N×N N×N 的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字 0 0 0。如下图所示:

在这里插入图片描述

某人从图中的左上角 A A A 出发,可以向下行走,也可以向右行走,直到到达右下角的 B B B 点。

在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。

此人从 A A A 点到 B B B 点共走了两次,试找出两条这样的路径,使得取得的数字和为最大。

输入格式
第一行为一个整数 N N N,表示 N × N N×N N×N 的方格图。

接下来的每行有三个整数,第一个为行号数,第二个为列号数,第三个为在该行、该列上所放的数。

行和列编号从 1 1 1 开始。

一行“0 0 0”表示结束。

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

数据范围
N ≤ 10 N≤10 N10
输入样例:

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 1 ] [ j 1 ] [ i 2 ] [ j 2 ] f[i_{1}][j_{1}][i_{2}][j_2] f[i1][j1][i2][j2]来表示两条路从 ( 0 , 0 ) (0,0) (0,0)分别走到 ( i 1 , j 1 ) , ( i 2 , j 2 ) (i_1,j_1),(i_2,j_2) (i1,j1)(i2,j2)

接下来考虑解决不能重复选择的问题。
只有当 i 1 + j 1 = = i 2 + j 2 i_1 + j_1 == i_2 + j_2 i1+j1==i2+j2的时候,才会有可能导致两个格子重叠。

因为在两条路线上,只有满足了是在同一个步数,才有可能位于同一个位置,也就是说这是一个必要不充分条件。
只有在这个条件成立的前提下 i 1 = = i 2 i_1 == i_2 i1==i2才可以保证重叠了

所以把状态表示为 f [ k ] [ i 1 ] [ i 2 ] f[k][i_1][i_2] f[k][i1][i2]表示从 ( 0 , 0 ) (0,0) (0,0)走到 ( i 1 , k − i 1 ) (i_1,k-i_1) (i1,ki1) ( i 2 , k − i 2 ) (i_2,k-i_2) (i2,ki2)的可能的路径中能选到数的最大值,k是两条路线各自的横纵坐标的和

划分为四种情况:
1.第一条向下,第二条向下 2.第一条向下,第二条向右
3.第一条向右,第二条向下 4.第一条向右,第二条向右

对于第一种情况,他的上一步情况就可以表示为 f [ k − 1 ] [ i 1 − 1 ] [ i 2 − 1 ] f[k-1][i_1-1][i_2-1] f[k1][i11][i21],状态转移时我们要进行判断两条路是否重叠,如果重叠就是 f [ k − 1 ] [ i 1 − 1 ] [ i 2 − 1 ] + w [ i 1 ] [ j 1 ] f[k-1][i_1-1][i_2-1] + w[i_1][j_1] f[k1][i11][i21]+w[i1][j1],如果没有重叠就是 f [ k − 1 ] [ i 1 − 1 ] [ i 2 − 1 ] + w [ i 1 ] [ j 1 ] + w [ i 2 ] [ j 2 ] f[k-1][i_1-1][i_2-1] + w[i_1][j_1] + w[i_2][j_2] f[k1][i11][i21]+w[i1][j1]+w[i2][j2]

代码:

#include<iostream>
using namespace std;
const int N = 15;int n;
int w[N][N];
int f[2 * N][N][N];int main(){cin >> 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) {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 - 1][i2 - 1] + t);	//情况1x = max(x, f[k - 1][i1 - 1][i2] + t);		//情况2x = max(x, f[k - 1][i1][i2 - 1] + t);		//情况3x = max(x, f[k - 1][i1][i2] + t);			//情况4}}cout << f[2 * n][n][n];return 0;
}

AcWing.275.传纸条

小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。

一次素质拓展活动中,班上同学安排坐成一个 m m m n n n 列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。

幸运的是,他们可以通过传纸条来进行交流。

纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标 ( 1 , 1 ) (1,1) (1,1),小轩坐在矩阵的右下角,坐标 ( m , n ) (m,n) (m,n)

从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递。

在活动进行中,小渊希望给小轩传递一张纸条,同时希望小轩给他回复。

班里每个同学都可以帮他们传递,但只会帮他们一次,也就是说如果此人在小渊递给小轩纸条的时候帮忙,那么在小轩递给小渊的时候就不会再帮忙,反之亦然。

还有一件事情需要注意,全班每个同学愿意帮忙的好感度有高有低(注意:小渊和小轩的好心程度没有定义,输入时用 0 0 0 表示),可以用一个 0 ∼ 100 0∼100 0100 的自然数来表示,数越大表示越好心。

小渊和小轩希望尽可能找好心程度高的同学来帮忙传纸条,即找到来回两条传递路径,使得这两条路径上同学的好心程度之和最大。

现在,请你帮助小渊和小轩找到这样的两条路径。

输入格式
第一行有 2 个用空格隔开的整数 m m m n n n,表示学生矩阵有 m m m n n n 列。

接下来的 m m m 行是一个 m × n m×n m×n 的矩阵,矩阵中第 i i i j j j 列的整数表示坐在第 i i i j j j 列的学生的好心程度,每行的 n n n 个整数之间用空格隔开。

输出格式
输出一个整数,表示来回两条路上参与传递纸条的学生的好心程度之和的最大值。

数据范围
1 ≤ n , m ≤ 50 1≤n,m≤50 1n,m50

输入样例:

3 3
0 3 9
2 8 5
5 7 0

输出样例:

34

观察这道题发现两个人互相传纸条,一个人只能向下或者向右,一个人只能向上或者向左,所以我们仍然可以把第二个人传的路线逆向过来,使得问题又一次变成了只能向下或者向右,且找两条最大路线的问题。

代码与上题相似:

#include<iostream>
using namespace std;
const int N = 55;int f[2 * N][N][N];
int w[N][N];
int n, m;int main() {cin >> n >> m;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> w[i][j];}}for (int k = 2; k <= m + 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 <= 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 - 1][i2 - 1] + t);x = max(x, f[k - 1][i1][i2 - 1] + t);x = max(x, f[k - 1][i1 - 1][i2] + t);x = max(x, f[k - 1][i1][i2] + t);}}}}cout << f[m + n][n][n];return 0;
}

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

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

相关文章

微信小程序(三十八)滚动容器

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.滚动触底事件 2.下拉刷新事件 源码&#xff1a; index.wxml <view class"Area"> <!-- scroll-y 垂直滚动refresher-enabled 允许刷新bindrefresherrefresh 绑定刷新作用函数bindscrollto…

单片机无线发射的原理剖析

目录 一、EV1527编码格式 二、OOK&ASK的简单了解 三、433MHZ 四、单片机的地址ID 五、基于STC15W104单片机实现无线通信 无线发射主要运用到了三个知识点&#xff1a;EV1527格式&#xff1b;OOk&#xff1b;433MHZ。下面我们来分别阐述&#xff1a; EV1527是数据的编…

网神 SecGate 3600 防火墙 route_ispinfo_import_save 文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Golang 基础 Go Modules包管理

Golang 基础 Go Modules包管理 在 Go 项目开发中&#xff0c;依赖包管理是一个非常重要的内容&#xff0c;依赖包处理不好&#xff0c;就会导致编译失败&#xff0c;本文将系统介绍下 Go 的依赖包管理工具。 我会首先介绍下 Go 依赖包管理工具的历史&#xff0c;并详细介绍下…

idea2023创建spring项目无法选择Java8

idea2023创建spring项目无法选择Java8 今天下载了新版的idea 2023.3.2&#xff0c;但是在创建springboot项目的时候只能选择Java17和Java21&#xff0c;没法选择其他的版本。 使用下面阿里云的地址替换Server URL中的start.spring.io的地址即可 https://start.aliyun.com/替…

C#调用WechatOCR.exe实现本地OCR文字识别

最近遇到一个需求&#xff1a;有大量的扫描件需要还原为可编辑的文本&#xff0c;很显然需要用到图片OCR识别为文字技术。本来以为这个技术很普遍的&#xff0c;结果用了几个开源库&#xff0c;效果不理想。后来&#xff0c;用了取巧的方法&#xff0c;直接使用了WX的OCR识别模…

Linux大集合

Linux Linux是什么&#xff1f; Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户、多任务、 支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和 64位硬件。 Linux内核 是一个Linux系统…

可达鸭二月月赛——入门赛第四场T3题解

姓名 王胤皓 AC 记录 题目&#xff1a; 思路 用数组进行操作太难&#xff0c;而这些操作可以再 STL 中的 vector 容器&#xff0c;有 insert 和 erase 函数&#xff0c;所以非常方便。 vector 下标从 0 0 0 开始&#xff0c;所以所有操作都要 − 1 -1 −1。 操作 1 1 1 …

Redis的数据类型Hash使用场景实战

Redis的数据类型Hash使用场景 常见面试题&#xff1a;redis在你们项目中是怎么用的&#xff0c;除了String数据类型还使用什么数据类型&#xff1f; 怎么保证缓存和数据一致性等问题… Hash模型使用场景 知识回顾&#xff1a; redisTemplate.opsForHash() 方法是 Redis 的 …

Spring Boot3整合Redis

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途。 目录 前置条件 1.导依赖 2.配置连接信息以及连接池参数 3.配置序列化方式 4.编写测试 前置条件 已经初始化好一个spr…

MyBatisPlus基础操作之增删改查

目录 一、基本使用 1.1 插入数据 1.2 删除操作 1.3 更新操作 二、条件构造器Wrapper 2.1 常用AbstractWrapper方法 2.1.1 示例一 2.2.2 示例二 2.2.3 示例三 2.2 常用QueryWrapper方法 2.2.1 示例一 2.2.2 示例二 2.2.3 示例三&#xff08;常用&#xff09; 2.3 常…

1978-2022年地级市全要素生产率数据

1978-2022年地级市全要素生产率数据 1、时间&#xff1a;1978-2022年 2、来源&#xff1a;城市统计年鉴以及各省市的统计年鉴 3、指标&#xff1a;省份、地区、年份、OLS、FE、RE、DGMM、SGMM、SFA1、SFA2、SFA3、SFA3D、TFE、非参数法 4、范围&#xff1a;421地区 5、参考…

Deepin基本环境查看(八)【系统安全:房、车、查房、查车】

Deepin基本环境查看&#xff08;八&#xff09;【系统安全&#xff1a;房、车、查房、查车】 - 相关文章目录1、概述2、想象中的... 现实中的...1&#xff09;想象中的我2&#xff09;梦幻中的我3&#xff09;现实中的我 3 要房、要车、还是房车都要1&#xff09;超级计算机2&a…

Pymysql之Connection中常用API

Connection中常用API 1、open() &#xff1a;检测数据库是否连接。 connect.open&#xff1a;如果数据库连接返回Trhe&#xff0c;否则返回False。 2、ping(reconnectTrue) connect.ping(reconnectTrue):如果reconnectTrue表示连接断开后&#xff0c;重新进行连接。 import…

Docker-Learn(三)创建镜像Docker(换源)

根据之前的内容基础&#xff0c;本小点的内容主要涉及到的内容是比较重要的文本Dockerfile 1. 编辑Dockerfile 启动命令行终端&#xff08;在自己的工作空间当中&#xff09;,创建和编辑Dockerfile。 vim Dockerfile然后写入以下内容 # 使用一个基础镜像 FROM ubuntu:late…

Centos8保姆级安装教程

1.下载地址 Downloadhttps://www.centos.org/download/ 2.安装教程 第一步创建新的虚拟机 第二步自定义高级 第三步这里是选择系统的兼容性&#xff0c;默认就可以 之后直接下一步 第四步选择稍后安装操作系统 之后点击下一步 第五步选择操作系统Linux 安装的是centos8 64位…

Ps:信息面板选项

点击“信息”面板控制菜单按钮&#xff0c;打开“信息面板选项” Info Panel Options对话框。 第一颜色信息 First Color Readout 指定在“信息”面板中的“第一颜色信息”区域显示的像素颜色值所基于的颜色模式。 模式 Mode --实际颜色 Actual Color 默认选项。显示在当前颜色…

第二十九天| 491.递增子序列 、46.全排列、47.全排列 II

Leetcode 491.递增子序列 题目链接&#xff1a;491 递增子序列 题干&#xff1a;给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出…

服装设计公司,如何用钉钉实现企业数字化成功转型?

钉钉作为数字化工作平台&#xff0c;为某服装设计公司实现了组织管理的数字化转型&#xff0c;构建了一站式的工作平台。通过钉钉赋能&#xff0c;有利于企业推进组织架构、员工沟通、产品运营和客户服务等方面的数字化、智能化转型。 借助钉钉平台&#xff0c;该服设公司轻松实…

oracle主库增加redo组数

redo log&#xff08;重做日志&#xff09;&#xff1a; 重做日志&#xff1a;简单来说就是&#xff0c;将oracle数据库的DML、DDL&#xff08;数据库操作语言&#xff0c;数据库定义i语言&#xff09;操作记录在日志中&#xff0c;方便恢复及备库使用&#xff0c;以组的方式管…