动态规划——浅谈dp如何入门,以及入门题目(值得收藏,持续更新)

前言

动态规划如何入门?如果你问我怎么精通,那我只能告诉你我也不知道,但你要问我怎么入门,那我就可以和你说道说道了.

我并没有能力也不想说你看完就会了,我只是想给大家开个头,你只要知道怎么写了怎么去思考了,你就可以通过刷题来强化思维了,能走多远就看各位的造化了!

动态规划入门须知

动态规划(Dynamic Programming, DP)是一种通过将复杂问题分解为更小的子问题并解决这些子问题来构建解决方案的算法设计方法。动态规划的核心是状态转移方程,它定义了如何从一个或多个已知状态转换到一个新的状态。状态转移方程是动态规划问题的递推关系,用于描述当前状态与之前状态的关系。

想要做好一道动态规划题,或者说想要写所有的动态规划题,基本上都是按照这个步子走

1.设计状态表示

dp,其实也是记忆化存储,不过dp数组存的是题目需要你求的最优解(后续看题目来说)

在开始写代码之前,我们基本上要提前想要dp数组是一维的,二维的,还是三维的,然后呢,数组的值代表什么,这个真的很重要!!!!,基本上dp 数组的值,就是我们的答案

2.状态转移方程

什么叫状态转移方程呢,说实话,笔者也很为难,自己都是半桶水,还想教会别人.

通俗地说,状态转移方程就是一个规则或公式,告诉你如何从已知的信息(以前的结果)推导出未知的信息(当前的结果)。就像搭积木一样,你用之前已经搭好的积木,按照一定的规则,搭建出新的积木。

3.确定初始条件以及边界

在状态转移方程开始之前,总要有开始的值吧,而且有时候还会有一些边界值要你人为设置的.

4.代码实现

所有东西都构思好了,就要代码实现了

你说上面都是写的什么玩意,我看不懂?没关系,看不懂就对了,因为我一开始也是蒙的,接下来

看一些题目吧,看完这些题目你还不会入门,那你来骂我好了                                                        

题目一

1137. 第 N 个泰波那契数 - 力扣(LeetCode)

这题就是最简单的入门题,为什么?因为他已经告诉你状态转移方程了

 Tn+3 = Tn + Tn+1 + Tn+2

那么,我们的状态表示怎么写呢?

dp[] 数组应该这么表示  dp[i] 表示,第i个位置的泰波那契数的值

然后边界也以及告诉你了,T0 = 0, T1 = 1, T2 = 1.

所以说,我们就可以开始写了

class Solution {
public:
    int tribonacci(int n) 
    {
        if(n==0) return 0;
        if(n==1||n==2) return 1;
        vector<int> dp(n+1);
        dp[0]=0,dp[1]=dp[2]=1;
       int a=0,b=1,c=1,d=0;
        for(int i=3;i<=n;i++)
        {
        //   d=a+b+c;
        //   a=b;
        //   b=c;
        //   c=d;
           dp[i]=dp[i-1]+dp[i-2]+dp[i-3];
        }
      return  dp[n];
    }
};

这个是常规写法,可以看到,每一步都是有迹可循的,按照上面的四步走写的

dp[] 数组应该这么表示  dp[i] 表示,第i个位置的泰波那契数的值

 Tn+3 = Tn + Tn+1 + Tn+2  是状态转移方程

  dp[0]=0,dp[1]=dp[2]=1; 是初始条件

最后实现代码

当然了,这里也有更优化的写法,就是滚动的数组

class Solution {
public:
    int tribonacci(int n) 
    {
        if(n==0) return 0;
        if(n==1||n==2) return 1;
        vector<int> dp(n+1);
        dp[0]=0,dp[1]=dp[2]=1;
       int a=0,b=1,c=1,d=0;
        for(int i=3;i<=n;i++)
        {
          d=a+b+c;
          a=b;
          b=c;
          c=d;
        }
      return  d;
    }
};

这里 a,b,c,d就好像一个滚动的桶,一直在往前走,然后最后d 就是答案.

题目二

LCR 088. 使用最小花费爬楼梯 - 力扣(LeetCode)

这题就稍微稍微有点难了

状态表示

首先,我们的状态表示最好是根据答案来的,答案要我们求最小花费.                              

那我们的dp数组怎么表示呢  还是 dp[i],一维数组,我们可以这么看,dp[i] 表示 如果你需要走到第 i 个台阶,所需要的最小花费,那么我们就可以记数组的大小为 n, 然后dp[n] 就是我们的答案

转移方程

我第 i 个的花费源于哪里?不是第 i-1 个台阶 就是第 i-2个台阶吧,我们只要取这两个的最小值加起来,是不是就可以表示,这是最小花费了?

还是不太懂大伙可以看图

cost 数组是台阶花费数组

我是花费x 走到 n 呢,还是花费y 走到 n 呢? 那就看谁更小了,然后加上原本的花费,别忘了

dp[] 表示花费

dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])

边界设置

这题没什么需要在意的,就是正常写就可以了,一开始dp 数组都是0

需要注意的是,我们是每个台阶都会算到的,所以不用担心说什么哎呀我某个台阶会不会没算到啊

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost)
{
  int  n=cost.size();

  vector<int> dp(n+1);

  for(int i=2;i<=n;i++)
  {
    dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
  }
  return dp[n];
    }
};  



结尾

今天暂时就写那么多,笔者的语言组织能力还是弱了点,后续会讲背包问题和子序列问题的

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

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

相关文章

Day12 待办事项接口增删改查(CURD)

​​​ 本章节实现了待办事项接口增删改查,效果如下 一.添加待办事项控制器(ToDoController) 控制器类需要继承 ControllerBase 基类需要添加 [ApiController] 特性以及 [Route] 特性Route(路由) 特性参数规则,一般写法是 [Route(“api/[controller]/[action]”)] 。也就…

算法 | hbut期末复习笔记

贪心选择策略&#xff1a;所求问题的整体最优解可以通过一系列局部最优的选择&#xff08;贪心选择&#xff09;得到 最优子结构&#xff1a;问题的最优解包括了其子问题的最优解 回溯法&#xff1a;具有限界函数的深度优先搜索法 回溯法的解空间&#xff1a;子集树&排列…

自动控制:自治系统与非自治系统的稳定性分析

自动控制&#xff1a;自治系统与非自治系统的稳定性分析 在自动控制领域&#xff0c;理解自治系统和非自治系统的区别对于分析系统稳定性至关重要。自治系统的运动方程只与系统的状态有关&#xff0c;而非自治系统的运动方程则与系统的状态和时间都有关系。本文将探讨非自治系…

低代码/无代码可以降低程序员哪些门槛

低代码/无代码开发平台是一种新兴的软件开发模式&#xff0c;它通过图形化界面、拖拽式操作等方式&#xff0c;快速构建应用程序&#xff0c;从而降低了开发者的准入门槛。这种模式对程序员来说&#xff0c;不仅可以提高开发效率&#xff0c;还可以在某些情况下促进业务人员成为…

mysql引入表名称的注意事项

1、遇到问题 mapper中的文件是这样的 解析出来的sql是这样的 sql显示为&#xff1a;select * from ‘tableName’ 2、解决方法 mapper文件种使用${tableName}而不是#{tableName}

mysql高级刷题-01-求项目子任务分组计算

这条 SQL 查询用于从 Tasks 表中计算项目的相关信息&#xff0c;并根据项目的总时长进行排序。具体来看&#xff0c;这段查询的目的是将连续的任务分组为一个项目&#xff0c;并计算每个项目的总天数、子任务 ID 列表、项目的开始日期和结束日期。下面是对这条 SQL 查询的详细分…

java版MES系统全套源码,支持 SaaS 多租户,管理后台的 Vue3 版本采用 :vue-element-plus-admin

MES生产制造执行系统源码&#xff0c;有演示&#xff0c;自主研发&#xff0c;多个项目应用案例&#xff0c;成熟稳定。支持二次开发&#xff0c;商业授权后可商用。 MES系统是面向制造企业车间执行层的生产信息化管理系统&#xff0c;能实时监控生产过程、管理制造数据、优化生…

K8S——安全机制

目录 机制说明&#xff1a; 一、认证&#xff08;Authentication&#xff09; 1、三种认证方式 ①HTTP Token 认证&#xff1a;通过一个 Token 来识别合法用户 ②HTTP Base 认证&#xff1a;通过用户名密码的方式认证 ③HTTPS 证书认证&#xff08;最严格&#xff09;&am…

【并发】Synchronized的底层原理

基本概念 Synchronized【对象锁】采用互斥的方式让同一时刻最多只有一个线程能够持有【对象锁】&#xff0c;如果其他线程想要获取这个【对象锁】就会被阻塞住 底层实现原理 我们可能听过&#xff0c;synchronized底层是通过Monitor来实现的&#xff0c;但如何直观的观察呢&…

一起来露营吧!2024COSP上海国际户外展带您逃离城市,尽享夏日美好~

夏日&#xff0c;清空&#xff0c;微风 宜在湖畔撒欢&#xff0c;宜在山野放松 宜露营、听音乐、感受自然 初夏时节&#xff0c;微风不燥&#xff0c;最适合露营啦&#xff01; 一块绿地&#xff0c;一顶帐篷&#xff0c;一片安静的湖 在如茵绿地上&#xff0c;躺进初夏里 …

同一浏览器不同用户登录覆盖问题

同一浏览器使用的 Cookie 是相同的&#xff0c;第二个用户登录时&#xff0c;将会覆盖第一个用户的登录信息。不能存放在 Cookie 内&#xff0c;这样不能唯一区分用户&#xff0c;所以将Cookies改成localStorage import Cookies from js-cookieconst TokenKey Admin-Tokenexp…

DNS域名

DNS域名 DNS是域名系统的简称 域名和ip地址之间的映射关系 互联网中&#xff0c;ip地址是通信的唯一标识 访问网站&#xff0c;域名&#xff0c;ip地址不好记&#xff0c;域名朗朗上口&#xff0c;好记。 域名解析的目的就是为了实现&#xff0c;访问域名就等于访问ip地址…

代码随想录算法训练营Day15|102.二叉树的层序遍历 226.翻转二叉树 101.对称二叉树

102.二叉树的层序遍历 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right)…

企业建设数字工厂管理系统该如何选择供应商

随着信息技术的飞速发展&#xff0c;数字化转型已成为企业提升竞争力的关键。在制造业领域&#xff0c;建设数字工厂管理系统更是实现智能化生产、优化资源配置、提高生产效率的重要途径。然而&#xff0c;面对市场上琳琅满目的数字工厂管理系统供应商&#xff0c;企业改如何选…

TCP协议的核心机制

TCP协议的核心机制 一:确认应答机制1.2:超时重传接收缓冲区 超时重传时间重置连接 一:确认应答机制 对于TCP协议来说,要解决的一个很重要的问题,就是可靠传输 可靠传输,不是指发送方能够100%的把数据发送给接收方,而是尽可能. 尤其是让发送方知道,接收方是否收到. 举个例子: …

Spring Boot 应用打 WAR 包后无法注册到 Nacos怎么办

你好&#xff0c;我是柳岸花开。 在微服务架构中&#xff0c;服务注册与发现是至关重要的一环。Nacos 作为阿里巴巴开源的注册中心&#xff0c;能够很好地满足这一需求。然而&#xff0c;在将 Spring Boot 应用打包成 WAR 部署到外部服务器时&#xff0c;可能会遇到服务无法注册…

实用软件分享---- i茅台 在windows上自动预约和自动获取小茅运的软件

专栏介绍:本专栏主要分享一些实用的软件(Po Jie版); 声明1:软件不保证时效性;只能保证在写本文时,该软件是可用的;不保证后续时间该软件能一直正常运行;不保证没有bug;如果软件不可用了,我知道后会第一时间在题目上注明(已失效)。介意者请勿订阅。 声明2:本专栏的…

基于JS实现《国家基本比例尺地形图分幅和编号》标准

1、标准 GB T 13989-2012国家基本比例尺地形图分幅和编号 地址&#xff1a;【高清版】GB T 13989-2012国家基本比例尺地形图分幅和编号 - 道客巴巴 2、1:100万比例尺 2.1 说明 2.2 计算公式 2.3 计算代码 2.3.1 元素数据定义 由于中国只到N层&#xff0c;所以只定义到O. …

自动控制:控制系统的灵敏度分析

自动控制&#xff1a;控制系统的灵敏度分析 引言 灵敏度问题在控制系统设计中至关重要。灵敏度衡量的是系统对参数变化和扰动的响应程度。本文将详细探讨灵敏度函数的概念&#xff0c;并推导出开环和闭环控制系统在前向路径和反馈路径元素扰动下的灵敏度表达式。 灵敏度概念…

8款监控电脑屏幕的软件排名(屏幕监控软件TOP8)

8款监控电脑屏幕的软件排名&#xff08;屏幕监控软件TOP8&#xff09; 作为企业管理者都想对企业的员工和电脑设备了如指掌&#xff0c;毕竟日防夜防家贼难防&#xff0c;利用电脑泄密者数不胜数&#xff0c;为此需要对电脑屏幕实施监控&#xff0c;小编为你推荐几个屏幕监控软…