【动态规划】数字三角形

news2024/12/25 12:59:51

算法提高课课堂笔记。

文章目录

  • 摘花生
    • 题意
    • 思路
    • 代码
  • 最低通行费
    • 题意
    • 思路
    • 代码
  • 方格取数
    • 题意
    • 思路
    • 代码

在这里插入图片描述

摘花生

题目链接

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

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

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

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

问Hello Kitty最多能够摘到多少颗花生。

在这里插入图片描述

输入格式

第一行是一个整数T,代表一共有多少组数据。

接下来是T组数据。

每组数据的第一行是两个整数,分别代表花生苗的行数R和列数 C。

每组数据的接下来R行数据,从北向南依次描述每行花生苗的情况。每行数据有C个整数,按从西向东的顺序描述了该行每株花生苗上的花生数目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]表示到达(i,j)点权重的最大值

因为只能向右走或向下走,所以到达(i,j)点的方式一定是:从左边的点向右走一步 / 从上面的点向下走一步

而左边的点权重最大值是f[i][j-1],上面的点权重最大值是f[i-1][j],从中取较大的,加上自身权值即可

代码

#include <bits/stdc++.h>

using namespace std;

const int N = 110;

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

int main()
{
    int tt;
    cin >> tt;
    while (tt -- )
    {
        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 ++ )
                f[i][j] = max(f[i - 1][j], f[i][j - 1]) + w[i][j];

        cout << f[n][m] << '\n';
    }
}

最低通行费

原题链接

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

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

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

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

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

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

请问至少需要多少费用?

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

输入格式

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

后面 N N N 行,每行 N N N 个不大于 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

题意

从左上角走到右下角,不超过2n-1步,求权重之和最小值

思路

和上一题一样,都是左上角走到右下角

步数不超过2n-1,翻译过来就是不走回头路

只是把最大值改成了最小值

代码

#include <bits/stdc++.h>

using namespace std;

const int N = 110, inf = 0x3f3f3f3f;

int n;
int w[N][N];
int f[N][N];

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

    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= n; j ++ )
            if (i == 1 && j == 1) f[i][j] = w[i][j];
            else
            {
                f[i][j] = -inf;
                if (i > 1) f[i][j] = min(f[i][j], f[i - 1][j] + w[i][j]);
                if (j > 1) f[i][j] = min(f[i][j], f[i][j - 1] + w[i][j]);
            }

    cout << f[n][n] << '\n';
}

方格取数

题目链接

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

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

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

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

输入格式

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

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

行和列编号从 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[i1][j1][i2][j2]表示所有从(1,1)分别走到(i1,j1)(i2,j2)路径的最大值

如何处理同一个格子不被重复选择呢?

因为从左上角走到右下角,走的步数都是一样的,所以i1 + j1 == i2 + j2一定成立

所以我们可以将f[i1][j1][i2][j2]降维为f[k][i1][i2],k就是当前走过的步数

f[k][i1][i2]怎么计算呢?

分为四种情况:

  1. 第一条线路最后一步向下,第二条线路最后一步向下f[k - 1][i1 - 1][i2 - 1]
  2. 第一条线路最后一步向下,第二条线路最后一步向右f[k - 1][i1 - 1][i2]
  3. 第一条线路最后一步向右,第二条线路最后一步向下f[k - 1][i1][i2 - 1]
  4. 第一条线路最后一步向右,第二条线路最后一步向右f[k - 1][i1][i2]

然后判断(i1,j1)和(i2,j2)是否重合,重合只用加 w[i1][j1],不重合需要加w[i1][j1] + w[i2][j2]

取最大值即可

代码

#include <bits/stdc++.h>

using namespace std;

const int N = 15;

int n;
int w[N][N];
int f[N * 2][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 * 2; 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);
                }
            }

    cout << f[n + n][n][n] << '\n';
}

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

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

相关文章

解决GitHub超时上不去

Github对于开发者开发者开发者来说肯定不陌生&#xff0c;但是Github 经常连接不上显示超时&#xff0c;一般都是节点ip的问题。本文主要介绍一下如何通过修改 Hosts 提升 Github 访问速度。之前在 Hosts 文件有加入过节点&#xff0c;不过容易失效&#xff0c;所以自己得常更新…

A10VSO140EF7、A10VSO45ED71变量柱塞泵比例放大器

A10VSO18EF1、A10VSO28EF2、A10VSO45EF5、A10VSO71EF7、A10VSO100EF2、A10VSO140EF7、A10VSO45ED71、A10VSO71ER72、A10VSO100ED71、A10VSO140ER72、A10VSO180ER71比例变量柱塞泵电流信号实现电比例控制。 高精确度。 发生电源故障时的安全功能&#xff0c;例如制动和转向系统…

Python爬虫(八)_Requests的使用

Requests&#xff1a;让HTTP服务人类 虽然Python的标准库中urllib2模块中已经包含了平常我们使用的大多数功能&#xff0c;但是它的API使用起来让人感觉不太好&#xff0c;而Requests自称"HTTP for Humans"&#xff0c;说明使用更简单方便。 Requests唯一的一个非转…

LeetCode--HOT100题(24)

目录 题目描述&#xff1a;234. 回文链表&#xff08;简单&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;234. 回文链表&#xff08;简单&#xff09; 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &…

微信-jssdk使用

需求: h5中使用微信的jsSDK,后续实现微信定位以及多图上传 微信文档 申请测试公众号 1.测试公众号进行配置 其中的域名是本地的ip地址 config接口进行权限配置,动态获取JS-SDK权限验证的签名 获取公众号accessToken以及jsTicket public static String WeChatAppId="wx…

Redis数据库的下载和安装

目录 第一章、Redis数据库的下载和安装1.1&#xff09;nosql数据库和 Redis 介绍1.2&#xff09;Windows中下载安装Redis数据库1.3&#xff09;Linux中安装Redis数据库1.4&#xff09;Linux中启动redis1.5&#xff09;Linux中关闭redis 第二章、三种Redis客户端连接Redis数据库…

0804|IO进程线程day7 【重点】线程的同步互斥(互斥锁、信号量、条件变量的概念及基本操作)

线程的同步互斥中的两个概念&#xff1a;临界资源、临界区&#xff1a; 临界资源&#xff1a;当多个任务同时访问一个资源的时候&#xff0c;我们将该资源称之为临界资源。临界区&#xff1a;访问临界资源的代码&#xff0c;称之为临界区线程之间&#xff0c;如果要进行通信&am…

从少年变成恶龙的平台经济

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦midjourney 产品统筹 / bobo 录音间 / 声湃轩北京站 东方甄选和抖音的“矛盾”再一次暴露出平台经济与入驻者之间微妙的关系。 平台经济&#xff0c;从一个引领时代…

人工智能有可能使下一代智力贫乏?

在ChatGPT推出之前&#xff0c;Maya认识的绝大多数大学生都会通过Google去完善自己的论文帮助。但人工智能之前的互联网其实是做不到真正的“高水平抄袭”&#xff0c;因为你根本无法找到复杂、具体、有创意或个性化的答案。 以上面提到的冲突解决课论文为例&#xff0c;写作要…

Effective Java笔记(30)优先考虑泛型方法

正如类可以从泛型中受益一般 &#xff0c;方法也一样。静态工具方法尤其适合于泛型化 。 Collections 中的所有“算法”方法&#xff08;例如 binarySearch 和 sort &#xff09;都泛型化了 。 编写泛型方法与编写泛型类型相类似 。 例如下面这个方法&#xff0c;它返回两个集合…

实战项目ssm权限系统 3-自定义注解+AOP拦截器记录登录日志

一 登录日志以及操作操作日志的操作 1.1 登录日志配置收集 1.1.1 编写log入库的service层接口 1.接口&#xff1a;在spring-security模块中 2.实现类&#xff1a;在service-system模块中 3.dao层&#xff1a;在service-system模块中 1.1.2 过滤器添加log记录 在过滤器中&…

ArcGISPro中如何使用机器学习脚本

点击工程 打开包管理器&#xff0c;我们可以发现&#xff0c;无法修改ArcGIS自带的默认python环境&#xff0c;所以我们需将默认环境进行克隆 点击设置 设置要克隆的地方&#xff0c;点击确定 激活克隆的环境&#xff0c;然后重写启动ArcGISPro 搜索并点击需要安装的库&#xf…

virtualBox安装openEuler、virtualBox安装欧安镜像、openEuler镜像安装、虚拟安装openEuler

应领导要求,为后面系统改成国产操作系统+国产数据的要求,写一篇openEuler的文章。 第一步:下载openEuler镜像:openEuler下载 | 欧拉系统ISO镜像 | openEuler社区官网 选择对应版本:现在一般是64位,下载64位即可 第二步:下载virtualbox,个人下载的7.0.10:Downloads …

【PCL-7】PCL统计滤波

【PCL-1】RANSAC平面分割_pcl ransac平面_WXG1011的博客-CSDN博客 这篇博客已介绍直通滤波与体素滤波&#xff0c;这里主要记录统计滤波。 统计滤波是遍历计算各测点与其领域点的平均距离&#xff0c;以此为标量&#xff0c;假设为高斯正态分布&#xff0c;按标准差去除离群点…

OpenAI允许网站阻止其网络爬虫;谷歌推出类似Grammarly的语法检查功能

&#x1f989; AI新闻 &#x1f680; OpenAI推出新功能&#xff0c;允许网站阻止其网络爬虫抓取数据训练GPT模型 摘要&#xff1a;OpenAI最近推出了一个新功能&#xff0c;允许网站阻止其网络爬虫从其网站上抓取数据训练GPT模型。该功能通过在网站的Robots.txt文件中禁止GPTB…

使用 Etcher 制作U盘系统盘

Etcher 资料&#xff1a; https://github.com/balena-io/etcher/blob/master/SUPPORT.md

网络优化工程师,你到底了解多少?

5G网络优化工程师到底是什么&#xff1f; 5G&#xff0c;第五代移动通信技术&#xff08;5th Generation Mobile Communication Technology&#xff0c;简称5G&#xff09;是具有高速率、低时延和大连接特点的新一代宽带移动通信技术&#xff0c;5G通讯设施是实现人机物互联的…

重磅!清华最新报告:文心一言超越ChatGPT 3.5

点击下方卡片&#xff0c;关注“CVer”公众号 AI/CV重磅干货&#xff0c;第一时间送达 今年国内厂商已发布很多大语言模型&#xff0c;其中最具代表性的产品有&#xff1a;百度的文心一言、阿里巴巴的通义千问、科大讯飞的星火等&#xff0c;最具代表性的开源工作有&#xff1a…

春秋云镜 CVE-2020-2551

春秋云镜 CVE-2020-2551 Weblogic iiop协议反序列化 靶标介绍 2020年1月15日&#xff0c;Oracle发布了一系列的安全补丁&#xff0c;其中Oracle WebLogic Server产品存在高危漏洞&#xff0c;漏洞编号CVE-2020-2551&#xff0c;CVSS评分9.8分&#xff0c;漏洞利用低难度&…

C++入门(小白篇1—编译器安装-代码注释等)

前言&#xff1a; 最近想学一下一下C看了一些博客内容写的倒是很充实&#xff0c;但是&#xff0c;细节不到位&#xff0c;我是有Python基础的&#xff0c;所以学习来蛮快的&#xff0c;但是对于小白的话&#xff0c;有好多小细节大多数博客还是不够详细&#xff0c;由此我想写…