【第二十五课】动态规划:数字三角形(acwing-898 / 蓝桥官网503 / c++代码)

news2024/11/20 6:30:38

目录

acwing-898数字三角形(模板题)

思路

注意点

代码

视频讲解推荐

2020蓝桥杯省赛-数字三角形

错误思路 (可不看)

思路

代码

注意点


 

续上之前的啦。 

【第二十五课】动态规划:01背包问题(acwing-2 / 思路 / 含一维数组优化 / c++代码)

适合在学习过背包问题的基础上看这篇。

这里我们介绍线性dp:

线性动态规划通常用于解决具有线性结构的问题,例如序列或数组。这类问题的一个典型特点是,问题的解决方案可以通过其子问题的解决方案来构建。例如,如果我们要找到一个序列的最长递增子序列,我们可以通过查找每个子序列的最长递增子序列来找到整个序列的最长递增子序列

acwing-898数字三角形(模板题)

思路

这道题题意不难理解,目的是 找到从第一行走到最后一行得到的和最大的这个最大值。要求是每一步都只能走距离该数最近的左下角和右下角的两个位置。

感觉在之前背包问题的基础上,这道题的思路还是很好理解的。就不多说了。

我们是要用二维数组来存储这个数字三角形的,为了方便表示,我们这样理解这个二维数组的行列:

斜着表示每一列。 

这样的话对于题目要求的这个数只能从其最近的左上角和右上角到达,表示出这两个位置的值就可以实现我们的思路。所以我们这样定义行列可以方便我们表示这一步。

回顾一下之前的背包问题的分析图:

这二者几乎是一样的。  

注意点

①因为根据上面的分析,我们需要用到上一次计算的结果,因此会出现二维数组下标进行-1的操作,因此我们读入数据下标从1开始,避免可能存在的数组越界问题

②理解我们所定义的二维数组的行列表示方法。

③由于我们考虑向左下角还是右下角走的时候,运用状态转移方程,会访问到 f 数组的

这些位置,因此我们需要在初始化 f 数组时扩大初始化的范围,包含进来这些可能会访问到的点

for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=i+1;j++)
        {
            f[i][j]=-INF;
        }
    }

我们把 f 数组都初始化为一个很大的负数是因为三角形中数据的范围包含负数,因此为了避免影响结果,我们需要将最大路径的初始值设为一个非常小的数。

④记得定义常量INF=0x3f3f3f3f,它表示一个很大的数,添上负号就表示一个很小的负数。

代码

#include<iostream>
#include<algorithm>
using namespace std;
const int N=510,INF=0x3f3f3f3f;
int n;
int a[N][N];
int f[N][N];//记录每个位置对应的:从起点到该位置的路径长度最大值
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            cin>>a[i][j];//读入三角形
        }
    }
    //初始化每个位置路径最大值
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=i+1;j++)
        {
            f[i][j]=-INF;
        }
    }
    f[1][1]=a[1][1];
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            f[i][j]=a[i][j]+max(f[i-1][j-1],f[i-1][j]);//注意左上角和右上角的下标表示
        }
    }
    int res=-INF;
    for(int i=1;i<=n;i++)//枚举最后一行找到最大路径
    {
        res=max(res,f[n][i]);
    }
    cout<<res;
    return 0;
}

由于我们这样从上往下考虑的时候,需要注意我们上面所说的注意点③的边界问题。

但是如果我们从下往上考虑,对于每一个数,我们只需要考虑这个数是从它的左下角还是右下角走过来的,因为我们从下往上考虑,所以我们考虑的数一定是存在的。这样就避免了我们由于担心有些不合法的数而多写的一些代码。

#include<iostream>
#include<algorithm>
using namespace std;
const int N=510;
int f[N][N];
int n;

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            cin>>f[i][j];
        }
    }
    for(int i=n-1;i;i--)//从底向上
    {
        for(int j=1;j<=n;j++)
        {
            f[i][j]+=max(f[i+1][j],f[i+1][j+1]);
        }
    }
    cout<<f[1][1];
    return 0;
}

这样的代码是从下往上考虑的写法,并进行了优化,由于刚开始输入的三角形只会被使用一次,因此我们可以之创建一个二维数组,在其基础上直接修改。

由于我们的 i 是不断递减的,所以状态转移方程由原来的+1变成-1即可。

视频讲解推荐

【【寒假每日一题】Day-2(《898. 数字三角形》动态规划)】

这是y总的讲解,很详细也有很多知识补充。可以看看。 

2020蓝桥杯省赛-数字三角形

题目链接: 

数字三角形

这道题和我们的模板题就多了一个条件:“向左下走的次数与向右下走的次数相差不能超过 1” 

错误思路 (可不看)

我刚开始我想着他既然是要求了走两边的次数相差,那我就定义两个变量记录次数,保证我们符合题意就行。

然后写出来这个鬼东西😂👌

就把两层循环里的内容改成了这个

if(f[i-1][j-1]>f[i-1][j] || (abs(l-r)<=1 && l<r)
{
    l++;
    f[i][j]=a[i][j]+f[i-1][j-1];
}
else{
    r++;
    f[i][j]=a[i][j]+f[i-1][j];}

这里我是忘记了 f  数组的含义:我们每一个 f 都是这个数所对应的可能性的最大值,我们经历循环的时候是不断地更新每个不同数字的最大值的过程,而不针对某一个数字的到达路径

虽然这道题我们写的两层循环,但即使是内层循环也是针对所有不同的数字的,而不针对某一个数字的

因此这样的写法思路都是错误的。

思路

我这里还是按照从上往下的思路考虑的。 

由于新增的这个条件意思是我们向左和向右走的次数差不多,这个条件会导致我们的路径更倾向于走向三角形的中心

为了获得最大的路径和,最后一行中间位置的值应该是最大的可能值。因为如果最后一行中间位置的值不是最大的可能值,而是更接近于左边或右边的值,那么要么向左下走的次数会多于向右下走的次数,要么相反,违反了给定的条件

关于这一点我们可以画个图自己走一下试试,就明白了。

(注意这个条件并不是说我们走的时候只能是一次左边一次右边,这里不要想错了(我想错了doge)

好了,理解这个条件给出的信息之后,我们就着重看这个信息告诉我们什么?

根据满足“向左下走的次数与向右下走的次数相差不能超过 1”,我们发现可能走到最后我们得到的答案很可能处在三角形最后一层的中心位置,那么我们就要考虑到当层数是偶数时,会有两个中间值,奇数情况下只有一个确定的值

下面是一个例子 

那么这道题的思路就清晰了,在我们模板的基础上 ,最后输出的时候对 n 的奇偶性进行判断,执行不同的结果就可以了

代码

#include<iostream>
#include<algorithm>
using namespace std;
const int N=110,INF=0x3f3f3f3f;
int f[N][N],w[N][N];
int n;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            cin>>w[i][j];
        }
    }
    for(int i=0;i<=n;i++)//采用从上往下的思考方式一定要初始化
    {
        for(int j=0;j<=i+1;j++)
        {
            f[i][j]=-INF;
        }
    }
    f[1][1]=w[1][1];//一定要记得赋第一个值
    for(int i=2;i<=n;i++)//记得i从2开始
    {
        for(int j=1;j<=i;j++)
        {
            f[i][j]=w[i][j]+max(f[i-1][j],f[i-1][j-1]);
        }
    }
    if(n%2)cout<<f[n][n/2+1];//奇数
    else cout<<max(f[n][n/2],f[n][n/2+1]);//偶数
    return 0;
}

注意点

采用从上往下的考虑方式一定要初始化 dp 数组

②记得把第一行的第一个值提前赋值f[1][1]=w[1][1]; 同时由于第一个值已经设置过,所以在下面的给dp数组赋值的双层循环中,行数 i 从2开始。这点一定要注意。

③最后分奇偶的输出结果不要搞错了,输出的是第n行的中间值。


这次先写到这里啦。

有问题欢迎指出,一起加油!!

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

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

相关文章

OS复习笔记ch3-1

引言 学到第三章&#xff0c;就正式步入我们OS的大门了 本章我们将围绕以下几个问题去解决 什么是进程&#xff1f;进程状态有哪些&#xff1f;进程如何描述&#xff1f;进程如何控制&#xff1f; 本节内容主要是回答前两个问题&#xff0c;第二节回答后两个问题。 进程 …

windows环境下安装Apache

首先apache官网下载地址&#xff1a;http://www.apachelounge.com/download/按照自己的电脑操作系统来安装 这里我安装的是win64 主版本是2.4的apache。 然后解压压缩包到一个全英文的路径下&#xff01;&#xff01;&#xff01;一定一定不要有中文 中文符号也不要有&#xff…

详细分析PyInstaller打包python为exe执行文件(附Demo)

目录 前言1. 基本知识2. Demo 前言 需要将python文件打包成exe文件&#xff0c;变成rpa自动化形式 1. 基本知识 PyInstaller是一个用于将Python应用程序打包成独立可执行文件的工具 可以将Python脚本打包成Windows、Linux和Mac OS X上的可执行文件&#xff0c;这个作用可以将…

【Linux】软硬链接与动静态库(理解软硬链接的特点及使用场景、如何建立动静态库与使用第三方库)

一、软链接 1.1 如何建立软链接 //建立软链接 -s代表soft ln -s 目标文件名 链接文件名//删除软链接 rm 链接文件 或 unlink 链接文件 1.2 软链接的特点与功能 通过ls -i指令可以查看文件的inode编号 、 可以看出目标文件与软链接文件各自有自己的inode&#xff0c;所以软…

揭秘App全渠道统计服务:如何精准追踪你的用户来源?

在移动互联网时代&#xff0c;App的推广和运营至关重要&#xff0c;而渠道统计则是衡量推广效果的关键一环。近日&#xff0c;xinstall推出了一款全新的App全渠道统计服务&#xff0c;该服务旨在帮助开发者和运营者更全面地了解用户来源&#xff0c;优化推广策略&#xff0c;从…

前端JS加密库CryptoJS的常用方法

CryptoJS是前端常用的一个加密库&#xff0c;如MD5、SHA256、AES等加密算法。 官方文档&#xff1a;https://www.npmjs.com/package/crypto-js 安装方法 方法一&#xff1a;直接在html文件中引入 <script type"text/javascript" src"path-to/bower_componen…

C# 项目:导线计算 / 坐标转换 / 曲线放样 / 水准网 / 导线网平差

文章目录 Part.I IntroductionPart.II 软件简介Chap.I 导线计算Chap.II 坐标转换Chap.III 曲线放样Chap.IV 水准网 / 导线网平差 Part.III 软件使用过程中可能遇到的问题Reference Part.I Introduction 本文将对几个基于 C# 开发的软件进行简要的介绍&#xff0c;这些软件都是…

前端更优雅的使用 jsonp

前端更优雅的使用 jsonp 背景&#xff1a;最近项目中又使用到了 jsonp 这一项跨域的技术&#xff0c;&#xff08;主要还是受同源策略影响&#xff09;&#xff0c;下面有为大家提供封装好的函数及对应使用示例&#xff0c;欢迎大家阅读理解 文章目录 前端更优雅的使用 jsonp同…

SAP-ERP TM运输管理模块详解-1

简介 SAP中的运输功能(即TM模块,属于SD的子模块)是后勤执行的一部分,用于自动计算交货成本。也就是说,SAP可以让系统自动对销售发货的商品计算运费,对于运费占这个成本很大比重的销售模式,可以使用该功能。运输功能相对于SD其他模块,相对比较独立的,应用面不是很广。其…

【算法一则】【贪心】数组中的数可以拼装成的最大数

题目 给定一组非负整数 nums&#xff0c;重新排列每个数的顺序&#xff08;每个数不可拆分&#xff09;使之组成一个最大的整数。 注意&#xff1a;输出结果可能非常大&#xff0c;所以你需要返回一个字符串而不是整数。 示例 1&#xff1a; 输入&#xff1a;nums [10,2] …

使用 frp 通过云厂商公网IP实现内网穿透

写在前面 有小伙伴推荐&#xff0c;简单了解博文内容涉及 内网穿透 工具 frp 的安装以及2个Demo内网的静态文件服务访问 Demo内网多端口映射 Demo理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候&#xff0c;眼前的…

【数据分析面试】32.矩阵元素求和 (Python: for…in…语句)

题目&#xff1a;矩阵元素求和 &#xff08;Python) 假设给定一个整数矩阵。你的任务是编写一个函数&#xff0c;返回矩阵中所有元素的和。 示例 1&#xff1a; 输入&#xff1a; matrix [[1, 2, 3], [4, 5, 6], [7, 8, 9]]输出&#xff1a; matrix_sum(matrix) -> 45…

判断n以内的素数个数的五种方法+时间对比

目录 方法一&#xff1a;暴力法 复杂度 方法二&#xff1a;跨度为6的倍数的优化 复杂度 方法三&#xff1a;埃氏筛法 复杂度 方法四&#xff1a;埃氏筛法的改良 复杂度 方法五&#xff1a;线性筛 复杂度 性能对比测试 练习 方法一&#xff1a;暴力法 就是写一个函…

STL--string详解

STL基本内容 string是什么 string实质上是一个对象 string可看作一个串&#xff0c;类似字符数组 可以扩容&#xff0c;可以增删查改 可用下表访问操作符[]引用&#xff0c;修改某值 构造函数 默认构造 拷贝构造&#xff1a;参数为(string 或 char*) 求string对象的长度不…

锂电池SOH预测 | 基于SVM的锂电池SOH预测(附matlab完整源码)

锂电池SOH预测 锂电池SOH预测完整代码锂电池SOH预测 锂电池的SOH(状态健康度)预测是一项重要的任务,它可以帮助确定电池的健康状况和剩余寿命,从而优化电池的使用和维护策略。 SOH预测可以通过多种方法实现,其中一些常用的方法包括: 容量衰减法:通过监测电池的容量衰减…

C语言学习/复习36

一、程序的环境与预处理 二、翻译环境与执行环境 三、运行环境 四、预编译(预处理)详解

【Hadoop】-Apache Hive使用语法与概念原理[15]

一、数据库操作 创建数据库 create database if not exists myhive; 使用数据库 use myhive; 查看数据库详细信息 desc database myhive; 数据库本质上就是在HDFS之上的文件夹。 默认数据库的存放路径是HDFS的&#xff1a;/user/hive/warehouse内 创建数据库并指定hdfs…

SVN--基本原理与使用(超详细)

目录 一、SVN概述二、SVN服务端软件安装三、SVN服务端配置四、SVN客户端软件安装与使用五、SVN三大指令六、SVN图标集与忽略功能6.1 图标集6.2 忽略功能 七、SVN版本回退八、SVN版本冲突九、SVN配置多仓库与权限控制9.1 配置多仓库9.2 权限控制 十、服务配置与管理十一、模拟真…

JAVASCRIPT+PHP+GB2312字库文件实现浏览器LED滚动效果

一、效果 二、源码 1、test_led.html <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>MATRIX LED</title> <script src"https://cdn.staticfile.net/jquery/1.10.2/jquery.min.js"></script…

渗透攻击思考题

目录 问题一&#xff1a; 存储过程&#xff1a; 密文存储&#xff1a; 问题二&#xff1a; 问题三&#xff1a; 问题四&#xff1a; LM Hash的加密: NTLM Hash 的加密&#xff1a; 问题一&#xff1a; windows登录的明文密码&#xff0c;存储过程是怎么样的&#xff0…