【动态规划专栏】专题一总结

news2024/9/24 9:25:28

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。

💓博主csdn个人主页:小小unicorn
⏩专栏分类:动态规划专栏
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

专题一

  • 第 N 个泰波那契数
  • 三步问题
  • 最小花费爬楼梯
  • 解码方法:
    • 3.初始化
    • 4.填表顺序
    • 5.返回值
  • 斐波那契数
  • 思维导图:

在专题一中,我们重点学习了动态规划的第一种类型:斐波那契模型,在程序中我们用四道题进行了练习与巩固。

第 N 个泰波那契数

来源:第 N 个泰波那契数

在第一题中:发现他跟我们的斐波那契数列其实是很相似的,在解决本题中,我们首先对问题进行了变形:
在这里插入图片描述
我们通过变形,得到了一个递推关系式,第四个数是我们对应前三个数的和。为解决此问题呢,我们通过举例子:引出了dp表的概念
在这里插入图片描述
dp表其实就是一个一维或者二维数组,而我们要做就是将dp表里面的值填满,而其中dp表里面的值就是我们要的答案。
动态规划基本上分为五步:

  • 1.状态表示
  • 2.状态转移方程
  • 3.初始化
  • 4.填表顺序
  • 5.返回值

其中状态转移方程由状态表示推出,而3.4.5步则为处理细节问题。

在第一题中,我们的状态表示为:

dp[i]:表示第i个泰波那契数

根据递推式,我们的状态转移方程为;

dp[i]=dp[i-3]+dp[i-2]+dp[i-1]

这道题其实基本上到这就已经结束了,最后不要忘了初始化以及边界处理即可。

代码实现:

class Solution 
{
public:
    int tribonacci(int n) 
    {
       //创建dp表
       vector<int> dp(n+1);
       //处理边界
       if(n==0)
       return 0;
       if(n==1||n==2)
       return 1;
       //初始化
       dp[0]=0;
       dp[1]=dp[2]=1;
       
       //填表
       for(int i=3;i<=n;i++)
       {
            dp[i]=dp[i-1]+dp[i-2]+dp[i-3];
       }
       return dp[n];
    }
};

三步问题

来源:三步问题

这道题很有意思,我们分析题目:举几个例子:
在这里插入图片描述
规律还是很好发现的,所以状态表示直接就是:

dp[i]:表示到达i位置时,有多少种方法

在分析状态转移方程时,我们要以i位置的状态,来划分问题:
在这里插入图片描述
到达iu位置的时候,我们要观察,他可以如何到达i位置,可以从i-1位置,也可以从i-2位置过来,还可以从i-3位置过来。

因此状态转移方程:

dp[i]=dp[i-3]+dp[i-2]+dp[i-1]

最后我们分析一下边界情况,分别在3,2,1,0位置取到。

代码实现:

class Solution 
{
public:
    int waysToStep(int n) 
    {
      const int MOD=1e9+7;
      //创建dp表
      vector<int> dp(n+1);
      //处理边界条件:
      if(n==1)
        return 1;
      if(n==2)
        return 2;
      if(n==3)
        return 4;
      //初始化
      dp[0]=0;
      dp[1]=1;
      dp[2]=2;
      dp[3]=4;
      for(int i=4;i<=n;i++)
      {
        dp[i]=((dp[i-3]+dp[i-2])%MOD+dp[i-1])%MOD;
      }
      return dp[n];
    }
};

最小花费爬楼梯

来源:最小花费爬楼梯

本题要小心一点的是:
楼顶是在整个数组外面而不是数组的最后一个位置。
每次爬楼梯只能爬一层或者两层。

本题在确定状态表示,我们还是根据经验,不过这道题当时咱们用了两种办法:

1.以i位置为结尾
2.以i位置为开始

以i位置为结尾:
状态表示:

dp[i]表示:以i位置为结尾时,的最小花费

状态转移方程:
首先,到达i位置有两种情况:
在这里插入图片描述
我们根据最近的一步来划分问题:
在这里插入图片描述
因此,状态转移方程:

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

边界情况在0位置和1位置。

第二种方法这里就不再解释了。

代码实现:

class Solution 
{
public:
    int minCostClimbingStairs(vector<int>& cost) 
    {
        //创建dp表
        int n=cost.size();
        vector<int> dp(n+1);
        //初始化
        dp[0]=dp[1]=0;
        //填表
        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];        
    }
};

解码方法:

来源:解码方法

对于本题而言就是:

dp[i]表示:以i位置为结尾时,解码方法的总数

在推方程之前,我们先画一下解码的情况:
在这里插入图片描述
分为单独解码和与前一个位置一起解码两种情况:
在这里插入图片描述
而单独解码和一起解码又要分为两种情况,成功和失败。
为什么会失败呢?
举个例子:
在这里插入图片描述
2和5可以一起解码,也可以分开解码,但到0位置时,就会解码错误,自己单独不能解码,要是与后面的6结合,
在这里插入图片描述
会出现之前说的前导0情况,也会解码错误。

因此,本题的状态转移方程为:

dp[i] = dp[i-1]+ dp[i-2]

3.初始化

本题初始化要在下标为0位置与下标为1位置进行初始化:
在这里插入图片描述

  dp[0]=s[0]!='0';
     //处理边界条件:
   if(n==1)
     return dp[0];
   if(s[0]!='0'&&s[1]!='0')
      dp[1]+=1;
   //前两个位置所表示的数:
   int t=(s[0]-'0')*10+s[1]-'0';
   if(t>=10&&t<=26)
      dp[1]+=1;

4.填表顺序

根据状态转移方程,我们计算dp[i]位置的值需要i-1与i-2位置的值,因此我们的填表顺序为:从左往右

5.返回值

我们要解码到最后一个位置,因此:返回dp[n-1]

代码实现:

class Solution 
{
public:
    int numDecodings(string s) 
    {
        // 1.创建dp表
        // 2.初始化
        // 3.填表
        // 4.返回值

        int n=s.size();
        vector<int> dp(n);
        dp[0]=s[0]!='0';
        //处理边界条件:
        if(n==1)
        return dp[0];

        if(s[0]!='0' && s[1]!='0')
            dp[1]+=1;
        //前两个位置所表示的数:
        int t=(s[0]-'0')*10+s[1]-'0';
        if(t>=10&&t<=26)
            dp[1]+=1;
        for(int i=2;i<n;i++)
        {
            //处理单独编码:
            if(s[i]!='0')
            dp[i]+=dp[i-1];
        //第二种情况对应的数:
        int t=(s[i-1]-'0')*10+s[i]-'0';
        if(t>=10&&t<=26)
            dp[i]+=dp[i-2];
        }
        return dp[n-1];
    }
};

斐波那契数

来源:斐波那契数

本题很简单,递推式题目都给了,直接上代码:

class Solution 
{
public:
    int fib(int n) 
    {
        //创建dp表
        vector<int> dp(n+1);
        //处理边界条件:
        if(n==0)
        return 0;
        if(n==1)
        return 1;
        //初始化
        dp[0]=0;
        dp[1]=1;
        //填表
        for(int i=2;i<=n;i++)
        {
            dp[i]=dp[i-1]+dp[i-2];
        }
        return dp[n];
    }
};

思维导图:

在这里插入图片描述
第一章所有代码以及解题思路画图版图片,以及思维导图都已上传至资源中。

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

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

相关文章

电脑错误mfc140.dll丢失怎么办?mfc140.dll丢失如何修复?

在使用基于Microsoft Visual Studio 2015开发的应用程序时&#xff0c;可能会遇到个别组件影响整体功能的情况&#xff0c;其中“mfc140.dll丢失”错误就是常见的一个技术障碍。这个DLL文件属于Microsoft Foundation Class (MFC) Library&#xff0c;它对Windows应用程序的运行…

基于vue框架的朝阳保险公司营销管理系统0wamc(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,保险信息,保险类型,订单信息,赔偿信息,联系我们,购买指南,到期提醒 开题报告内容 基于Vue框架的朝阳保险公司营销管理系统的开题报告 一、研究背景 随着保险行业的快速发展和市场竞争的日益激烈&#xff0c;传统的管理模式已难以…

恶意代码分析 | Lab1

前言 穿插virus分析的学习&#xff0c;毕竟逆向技术最后要用在攻防中。 Lab1就没必要动态分析了&#xff0c;静态学学写法。 Lab01-01.exe 前面是内存映射技术&#xff0c;对内存进行修改操作。 将Kernel32.dll和Lab01-01.dll的内存都Map出来&#xff0c;便于后续更改&…

有没有性价比高一些的开放式耳机推荐?盘点四款高性价比蓝牙耳机

在正式介绍几款高性价比产品&#xff0c;先来和各位聊聊什么是开放式耳机。开放式耳机是目前比较流行的耳机种类&#xff0c;其特点是通过采用海绵状的微孔发泡塑料制作透声耳垫&#xff0c;不堵塞耳道&#xff0c;使得声音可以泄露&#xff0c;同时佩戴者也能听到外界声音 。 …

民宿酒店预订系统V1.0.8

多门店民宿酒店预订管理系统&#xff0c;快速部署属于自己民宿酒店的预订小程序&#xff0c;包含预订、退房、WIFI连接、吐槽、周边信息等功能。提供全部无加密源代码&#xff0c;支持私有化部署。 V1.0.8修复房间预订状态无法筛选的问题 修复房间预订状态无法筛选的问题 修复…

为自闭症儿童提供全方位支持的自闭症全托管机构

在自闭症儿童的世界里&#xff0c;每一个细微的进步都凝聚着家庭与社会的无尽努力与期盼。星启帆自闭症儿童康复机构&#xff0c;作为一所致力于为自闭症儿童提供全方位支持的全托管机构&#xff0c;正以其专业的服务、温馨的环境和全面的康复计划&#xff0c;成为众多家庭信赖…

UE4_后期处理_后期处理材质及后期处理体积二

效果&#xff1a; 步骤&#xff1a; 1、创建后期处理材质,并设置参数。 2、回到主界面&#xff0c;找到需要发光的物体的细节面板。 渲染自定义深度通道&#xff0c;默认自定义深度模具值为10&#xff08;需要修改此值&#xff0c;此值影响物体的亮度&#xff09;。 3、添加…

pytest压力测试:不断发送数据,直到发现数据丢失

示例场景 假设有一个 send_data 函数接受数据并返回成功或失败的状态。 创建一个测试用例&#xff0c;通过逐步增加数据量来测试这个函数&#xff0c;直到返回失败为止。 步骤 定义压力测试函数 定义一个函数。不断发送数据&#xff0c;直到发现数据丢失。 创建 pytest 测试…

PHP一站式班级解决方案班级管家系统小程序源码

一站式班级解决方案 —— 班级管家系统 &#x1f393;【开篇&#xff1a;班级管理的烦恼&#xff0c;你中招了吗&#xff1f;】&#x1f393; 作为班主任或班级管理者&#xff0c;你是否经常为繁琐的班级事务而头疼&#xff1f;从日常通知的发布到作业的收集&#xff0c;从班…

ChatGPT写文章时,如何去除生硬的Ai味?

仅做分享&#xff0c;侵删 在使用AI进行写作时&#xff0c;常常会发现生成的文章带有明显的“机器味”&#xff0c;一眼就能看出是由AI生成的。这是许多希望借助AI进行自媒体创作的小伙伴们面临的一个主要问题。AI生成的文章往往过于书面化&#xff0c;缺乏人情味&#xff0c;导…

葡萄检测-目标检测数据集(包括VOC格式、YOLO格式)

葡萄检测-目标检测数据集&#xff08;包括VOC格式、YOLO格式&#xff09; 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1YMwAaSJc8H5SI0f8RVSidw?pwdiygs 提取码&#xff1a;iygs 数据集信息介绍&#xff1a; 共有1646 张图像和一一对应的标注文件 标注文…

matlab实现kaiser窗+时域采样序列(不管原信号拉伸成什么样子)是一样的,变到频谱后再采样就是一样的频域序列。

下图窗2的频谱在周期化的时候应该是2&#xff08;w-k*pi/T&#xff09;我直接对2w减得写错了 可见这两个kaiser窗频谱不一样&#xff0c;采样间隔为2T的窗&#xff0c;频谱压缩2倍&#xff0c;且以原采样频率的一半周期化。 但是这两个不同的kaiser窗在频域采样点的值使完全一…

MySQL复习4

触发器 触发器&#xff08;trigger&#xff09;是 MySQL 提供给程序员和数据分析员来保证数据完整性的一种方法&#xff0c;他是与表时间相关的特殊存储过程&#xff0c;他的执行不是由程序调用&#xff0c;也不是手动启动&#xff0c;而是由事件来触发&#xff0c;比如当时对…

2024-09-04作业

作业 代码 #include <iostream> using namespace std; class Animal { private: string narrator; public: Animal(){} Animal(string narrator):narrator(narrator) {} virtual void perform() { cout << "讲解员解说中&…

神策SDK不支持Windows客户端全埋点,怎么实现用户统计分析?

本文将介绍&#xff0c;ClkLog针对神策不支持全埋点的客户端实现用户访问基础统计分析 1。 客户遇到的问题 ClkLog的用户访问基础统计分析功能是基于神策SDK的全埋点来实现的。 我们遇到有些客户是使用C、C#等语言来开发的客户端&#xff0c;然而神策此类SDK&#xff08;如C, C…

activiti PROC_DEF_ID_超64位解决方案

默认得id是这样的 如果前面的code长了&#xff0c;就会出问题&#xff0c;而且手动修改activiti相关表里面的长度也不行&#xff0c;所有改采用雪花算法&#xff0c;把后面的uuid了&#xff0c;修改后 这也64的长度也够了&#xff0c;注意只对新发布的流程有效 <dependency…

代码随想录算法训练营第三十六天|1049. 最后一块石头的重量 II 494. 目标和 474.一和零

1049. 最后一块石头的重量 II 题目&#xff1a; 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那…

[Linux]:环境开发工具

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Linux学习 贝蒂的主页&#xff1a;Betty’s blog 1. 软件包管理器——yum 1.1 yum的概念 在Linux系统中&#xff0c;如果想安…

【C++深入学习】日期类函数从无到有实现

零、本文思维导图 一、前期准备 1.1 检查构造的日期是否合法 //Date.cpp bool Date::CheckDate() {if (_month < 1 || _month > 12|| _day < 1 || _day > GetMonthDay(_year, _month)){return false;}else{return true;} }Date::Date(int year, int month, int d…

3.6 排序

在第一趟排序之后&#xff0c;一定能把数据表中最大或最小元素放在其最终位置上的排序算法是&#xff08; &#xff09;。 A. 冒泡排序 B. 直接插入排序 C. 快速排序 D. 归并排序 正确答案是 A。 解析 第i趟冒泡排序是从第1个元素到第n-i1个元素依次比较相邻两个元素的关键字&a…