AcWing 1.1 数字三角形模型 dp动态规划

news2025/1/12 5:02:14

(1)ACWing 1015. 摘花生 1015. 摘花生 - AcWing题库

Hello Kitty想摘点花生送给她喜欢的米老鼠。她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。Hello Kitty只能向东或向南走,不能向西或向北走。问Hello Kitty最多能够摘到多少颗花生。

输入样例: 

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

 输出样例:

8
16

 

>>动规五部曲:

1.确定dp数组以及下标的含义

  • dp[i][j] :为到达 (i , j) 位置的最多能够摘到的花生数,最终所求结果即为 dp[n][m] 

2.确定递推公式

  • dp[i][j] = max(dp [i][j − 1], dp[i − 1][j]) + w [i][j]

3.dp 数组初始化

  • dp[i][j]初始化为0

4.确定遍历顺序

  • 从上到下,从左到右遍历,这样能保证dp[i][j]是经过计算得来的 

5.举例推导dp数组  

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 110;

int n, m;
int w[N][N], dp[N][N];

int main() {
    int T;
    cin >> T;
    while (T--) {
        cin >> n >> m;
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
                cin >> w[i][j];

        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + w[i][j];
        cout << dp[n][m] << endl;
    }
}

(2)ACWing 1018. 最低通行费(DP)

ACWing 1018. 最低通行费(原题链接)

题目描述:一个商人穿过一个 N × N 的正方形的网格,去参加一个非常重要的商务活动。他要从网格的左上角进,右下角出。每穿越中间 1 个小方格,都要花费 1 个单位时间。商人必须在 ( 2 N − 1 )  个单位时间穿越出去。而在经过中间的每个小方格时,都需要缴纳一定的费用。这个商人期望在规定时间内用最少费用穿越出去。请问至少需要多少费用

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

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

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

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

数据范围:1 ≤ N ≤ 100 

输入样例: 

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 

关键信息:时间不超过 (2 N − 1) ,意味着不能走回头路!!!
发现不能走回头路的性质后就和 ACWing 1015.摘花生 基本一样了,只不过将最大值换成了最小值
>>动规五部曲:

1.确定dp数组以及下标的含义

  • dp[i][j] :为到达 (i , j) 位置的最小通行费,最终所求结果即为 dp[n][n] 

2.确定递推公式

  • dp[i][j] = min (dp[i][j − 1], dp[i − 1][j]) + w [i][j]

3.dp 数组初始化

  • dp[i][j]初始化为INF
  • dp[0][1]=0;dp[1][0]=0

4.确定遍历顺序

  • 从上到下,从左到右遍历,这样能保证dp[i][j]是经过计算得来的

5.举例推导dp数组 

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 110,INF = 1e9;

int n;
int w[N][N];
int dp[N][N];

int main() {
	scanf_s("%d", &n);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			scanf_s("%d", &w[i][j]);
	memset(dp, 0x3f, sizeof dp);
	dp[0][1] = 0; dp[1][0] = 0;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++) {
			dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + w[i][j];
		}
	printf("%d\n", dp[n][n]);
	return 0;
}

>>知识点回顾:

(1)最常用的memset赋值

#include <cstring>
memset(f, 0, sizeof(f));
0x3f(正无穷)
-0x3f(负无穷)
memset(f, 0x3f, sizeof(f)); 每个元素大小1,061,109,567
memset(f, -0x3f, sizeof(f)); 每个元素大小-1,044,266,559

推荐和参考文章: 

普通数组的memset函数用法详细解读_memset数组-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_43827595/article/details/101452656ACWing 1018. 最低通行费(DP)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzcstxwd/article/details/127530180(3)ACWing 1027.方格取数

https://www.acwing.com/problem/content/1027/

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

某人从图中的左上角A出发,可以向下行走,也可以向右行走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中奖变为数字0)。此人从A点到B点共走了两次,试找出两条这样的路径,使得取得的数字和为最大。

输入格式:第一行为一个整数N,表示 NxN 的方格图。接下来的每行有三个整数,

                  第一个为行号数,第二个为列号数,第三个为在该行、该列上所放的数,

                  一行"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] 表示所有从(1,1)走到(i,j)的路径的最大值

  • f[i,j] = max(f[i-1,j]+w[i,j],f[i,j-1]+w[i,j])

走两次:f[i1,j1,i2,j2] 表示所有从(1,1),(1,1)分别走到(i1,j1),(i2,j2)路径的最大值。考虑一下两条路线什么时候会走到同一个格子呢?

这个题有两种思路:

  • 第一种思路:第一个人先走,然后标记一下,接着第二个人再走
  • 第二种思路:同时走

同时走的话,如何处理“同一个格子不能被重复选择”?

需要考虑的是什么时候两条路线会有交集呢?必然在同一个格子的时候会有交集。那它们走到同一个格子的时候,这两条路线走过的总步数是一样的。

  • i1+j1==i2+j2 时,两条路径的格子才可能重合

其中k:k = i1+j1= i2+j2(k表示两条路线当前走到的格子的横纵坐标之和)

  • f[k,i1,i2] 表示所有从(1,1),(1,1)分别走到(i1,k-i1),(i2,k-i2)的路径的最大值

#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_s("%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) {
					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 - 1][i2] + t);
					x = max(x, f[k - 1][i1][i2 - 1] + t);
					x = max(x, f[k - 1][i1][i2] + t);
				}
			}
	printf("%d\n", f[n + n][n][n]);
	return 0;
}

 知识回顾:“p->q”:① q是p的必要条件; ② p是q的充分条件

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

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

相关文章

从设计、制造到封测,XSKY 智能存储助力半导体行业数字化转型

近日&#xff0c;ECS2023 第五届中国电子通信与半导体 CIO 峰会在深圳召开&#xff0c;峰会以“数字科技与业务重塑”为主题&#xff0c;汇聚了 300来自电子通信与半导体行业知名企业高管、CIO、信息化与数字化负责人&#xff0c;交流电子通信与半导体行业的创新的产品和解决方…

65、内网安全-域环境工作组局域网探针方案

目录 案例1-基本信息收集操作演示案例2-网络信息收集操作演示案例3-用户信息收集操作演示案例4-凭据信息收集操作演示案例5-探针主机域控架构服务操作演示涉及资源 我们攻击内网一般是借助web攻击&#xff0c;直接进去&#xff0c;然后再去攻击内网&#xff0c;那么攻击的对象一…

Python 继承和子类示例:从 Person 到 Student 的演示

继承允许我们定义一个类&#xff0c;该类继承另一个类的所有方法和属性。父类是被继承的类&#xff0c;也叫做基类。子类是从另一个类继承的类&#xff0c;也叫做派生类。 创建一个父类 任何类都可以成为父类&#xff0c;因此语法与创建任何其他类相同&#xff1a; 示例&…

贪心算法学习——加油站

目录 一&#xff0c;题目 二&#xff0c;题目接口 三&#xff0c;解题思路及其代码 一&#xff0c;题目 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油…

单链表的定义(数据结构与算法)

单链表的定义 单链表是一种常见的数据结构&#xff0c;用于存储元素的序列。它由一系列节点组成&#xff0c;每个节点包含一个数据元素和一个指向下一个节点的引用&#xff08;指针&#xff09;。单链表中的节点之间通过指针连接起来&#xff0c;形成一个线性结构。单链表是一种…

【C++进阶之路】第三篇:二叉搜索树 kv模型

文章目录 一、二叉搜索树1.二叉搜索树概念2.二叉搜索树操作3.二叉搜索树的实现 二、二叉搜索树的应用1.kv模型2.kv模型的实现 三、 二叉搜索树的性能分析 一、二叉搜索树 1.二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性…

使用 kind 集群实现 all-in-one 在线安装 DCE 5.0 社区版

文章目录 一、什么是DCE 5.0二、部署先决条件三、创建云服务器实例3.1 实例节点配置[最低配置要求]3.2 远程连接云实例3.3 更新系统 四、安装Docker-CE五、使用 Kind 搭建 Kubernetes 集群六、安装依赖包6.1 helm安装6.2 skopeo安装6.3 kubectl安装6.4 yq安装 七、安装 DCE 5.0…

软考系列(系统架构师)- 2014年系统架构师软考案例分析考点

试题一 软件架构&#xff08;MYC 架构、扩展接口模式&#xff09; MVC架构风格最初是Smalltalk-80中用来构建用户界面时采用的架构设计风格。其中M代表模型&#xff08;Model)&#xff0c;V代表视图&#xff08;View)&#xff0c;C代表控制器&#xff08;Controller)。在该风格…

Transformers实战(一)快速入门命名实体识别、多项选择

Transformers实战&#xff08;一&#xff09;快速入门命名实体识别、多项选择 1、命名实体识别(NER) 1.1 命名实体识别简介 1.1.1 NER数据标注体系 命名实体识别(Named Entity Recognition&#xff0c;简称NER)是指识别文本中具有特定意义的实体&#xff0c;主要包括人名、…

【管理运筹学】第 10 章 | 排队论(4,系统容量有限制和顾客源有限的情形)

文章目录 引言一、系统的容量有限制&#xff08; M / M / 1 / N / ∞ M/M/1/N/\infty M/M/1/N/∞&#xff09;二、顾客源为有限的情形&#xff08; M / M / 1 / ∞ / m M/M/1/\infty/m M/M/1/∞/m&#xff09;写在最后 引言 了解了标准的 M / M / 1 M/M/1 M/M/1 模型后&#…

[UDS] --- DiagnosticSessionControl 0x10 service

1 会话 $10包含3个子功能&#xff0c;01 Default默认会话&#xff0c;02 Programming编程会话&#xff0c;03 Extended扩展会话&#xff0c;ECU上电时&#xff0c;进入的是默认会话&#xff08;Default&#xff09;。 为什么设计三个会话模式呢&#xff1f;因为权限问题。默认…

华为eNSP配置专题-路由策略的配置

文章目录 华为eNSP配置专题-路由策略的配置0、概要介绍1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、终端构成和连接2.2、终端的基本配置 3、配置路由策略3.1、目标3.2、配置路由策略 华为eNSP配置专题-路由策略的配置 0、概要介绍 路由策略就是通过一系列工具…

Java SE 学习笔记(十四)—— IO流(2)

目录 1 字节流1.1 字节流写数据1.1.1 创建字节输出流对象1.1.2 字节流写数据 1.2 字节流读数据1.2.1 创建字节输入流对象1.2.2 字节流读数据 1.3 字节流复制文件1.4 流的刷新与关闭1.5 资源释放方式1.5.1 try-catch-finally1.5.2 try-with-resource 2 字符流2.1 字符流概述2.2 …

Spring中Bean的作用域

目录 一、什么是Bean的作用域 二、Scope注解 三、Bean的6种作用域 3.1 singleton单例模式 3.2 prototype 原型模式 3.3 request 3.4 session 3.5 application 3.6 websocket 一、什么是Bean的作用域 在之前学习的过程中&#xff0c;我们把作用域定义为&#xff1a;限定程序中变…

关于数字化转型的know how

关于定义——到底什么是“数字化转型”&#xff1f; 关于价值——数字化转型对企业到底有多重要&#xff1f; 关于框架——企业数字化转型的框架必备要素有哪些&#xff1f; 关于执行——企业数字化转型到底怎么做&#xff1f; 一、什么是数字化转型&#xff1f; 现在各种…

Flink将数据写入MySQL(JDBC)

一、写在前面 在实际的生产环境中&#xff0c;我们经常会把Flink处理的数据写入MySQL、Doris等数据库中&#xff0c;下面以MySQL为例&#xff0c;使用JDBC的方式将Flink的数据实时数据写入MySQL。 二、代码示例 2.1 版本说明 <flink.version>1.14.6</flink.version…

2000-2021年上市公司内部薪酬差距数据(原始数据+计算代码Stata do文档+计算结果)

2000-2021年上市公司内部薪酬差距数据&#xff08;原始数据计算代码Stata do文档计算结果&#xff09; 1、时间&#xff1a;2000-2021年 2、来源&#xff1a;上市公司年报 3、指标&#xff1a; 原始数据指标&#xff1a;code、year、证券代码、应付职工薪酬、员工人数、支付…

美国IP代理如何获取?适用于哪些场景?

美国代理IP可以是静态&#xff08;不会改变&#xff09;或动态&#xff08;周期性更改&#xff09;&#xff0c;并且可以由专业的代理服务提供商提供。不同的代理IP服务提供商可能提供不同类型的代理&#xff0c;包括数据中心代理、住宅代理和移动代理&#xff0c;以满足不同用…

RT-Thread 7. RT-Thread Studio ENV修改MCU型号

1. 修改MCU型号 2.在ENV界面输入 scons -c scons --dist3. dist下为更新后完整源代码 4.导入RT-Thread Studio 发现GD32F330已经生效了。 5. 自己编写startup_gd32f3x0.S&#xff0c;准确性待验证 ;/* ; * Copyright (c) 2006-2021, RT-Thread Development Team ; * ; * SPD…

Vue组件样式设置,解决样式冲突问题

如果我们在不同的组件内&#xff0c;使用相同的类名&#xff0c;就会发生样式的冲突&#xff0c;使用后引入的组件中的样式&#xff1a; 一、scoped属性 在一个组件的style标签上添加scoped属性&#xff0c;该组件的所有样式都是该组件独有的&#xff0c;即使其他组件中有相同…