动态规划专题一 斐波那契数问题

news2024/9/26 5:15:59

目录

 题一 最小花费爬楼梯

1、算法解析

1)确定状态:

​编辑2)状态转移方程:

​编辑3)初始化:

4)填表顺序:

5)返回值:

2、代码

题二 第N个泰波那锲数

1、算法解析

1、确定状态

2、状态转移方程

3、初始化

4、填表顺序

5、返回值

2、代码

3、空间优化版本

 题三 三步问题

1、算法解析

1、确定状态:

2、状态转移方程:

3、初始化:

4、填表顺序:

5、返回值:

2、代码

  题四 解码方法

1、算法解析

1、确定状态:

2、状态转移方程:

3、初始化:

4、填表顺序:

5、返回值:

2、代码


 题一 最小花费爬楼梯

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

1、算法解析

1)确定状态:

确定状态是在干什么?
就是确定状态dp数组中的值代表什么含义。根据分析,我们发现:

状态表的dp[i]值是到达该位置的最小花费


2)状态转移方程:

一般来说,状态转移方程,就是根据i位置之前或者i位置之后,来推导出i的值
只要你能根据之前或或者之后的值来推导出i的值
那么,状态转移方程就出来了
但是,怎么推?
这个就要就题目而言
但是,大体的思路是这样的:根据最近的状态来划分问题

在这个题目中,我们第 i 位置的值,需要前面两个位置的值来确定,其分析过程如下:


3)初始化:

初始化就是保证,在我们进行填表的时候不越界
例如说,我要求dp[0]/dp[1]位置的值,需要前面的位置,但是此时明显已经越界
因此,这两个位置需要单独处理

4)填表顺序:

什么是填表顺序?
很好理解,例如说本题
i位置值得求解,需要前面两个位置的值已经存在才能求解
因此,也就是说在算i位置时,i-1 和 i-2 位置已经填了,已经有值了
所以,在这个题中,我们的填表顺序应该是从前往后,因为后面的值的求解需要前面的值


5)返回值:

因为我们要的是跨过所有台阶,所以这里的返回值是一维数组第n个位置的值
因此,返回值即dp[n]

2、代码

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        //创建dp表(我们要返回n位置,多创建一个位置)
        int n = cost.size();
        vector<int> dp(n+1);

        //初始化(走到0和走到1,是不需要花费的)
        dp[0] = 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];

    }
};

题二 第N个泰波那锲数

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

1、算法解析


你自己根据我第一题的过程,自己照着求解一般,然后写出代码。

1、确定状态

确定状态是在干什么?
就是确定状态dp数组中的值代表什么含义
dp表里某个位置值的状态就是题目的解

2、状态转移方程

dp[i] = dp[i-1] + dp[i-2] + ap[i-3];题目都直接给了

3、初始化

保证填表的时候越界
根据状态表示方程进行填表
状态方程是dp[i] = dp[i-1] + dp[i-2] + ap[i-3];
因此当i小于3的时候,越界
因此,初始化状态表,dp[0] = 0;dp[1] = ap[2] = 1;

4、填表顺序

从左往右填表,因为第n个位置的值,需要前面三个值已经计算好。

5、返回值

结果是第n个位置的值
所以,返回值就是dp[n](因此需要多创建一个位置的空间)
 

2、代码

class Solution {
public:
    int tribonacci(int n) {

        if(n == 0) return 0;
        if(n == 1|| n == 2) return 1;

        //1、创建dp表
        vector<int> dp(n + 1);

        //2、初始化
        dp[0] = 0;
        dp[1] = dp[2] = 1;

        //3、填表
        for(int i = 3; i<=n; i++ )
            dp[i] = dp[i-1] + dp[i-2] + dp[i-3];
        
        //4、确定返回值
            return dp[n];        


    }
};

3、空间优化版本

//空间优化版本
class Solution {
public:
    int tribonacci(int n) {

        if(n == 0) return 0;
        if(n == 1|| n == 2) return 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;
        
    }
};

 题三 三步问题

面试题 08.01. 三步问题 - 力扣(LeetCode)

1、算法解析

1、确定状态:

定义 dp[i] 数组中的值到底表示什么意思?
很简单,根据题目,就是到达该台阶一共有多少种走法。
我们的目标是求解 dp[n],即上到第 n 阶台阶的方式数量。

2、状态转移方程:

考虑小孩每次可以走 1 阶、2 阶或 3 阶:

因此,状态转移方程为:
dp[i] = dp[i-1] + dp[i-2] + dp[i-3]

3、初始化:

dp[0] = 1:上到第 0 阶只有一种方式,就是不走任何台阶。
dp[1] = 1:上到第 1 阶只有一种方式,就是从地面直接走一阶。
dp[2] = 2:上到第 2 阶有两种方式,可以走两次一阶或者一次两阶。
为什么初始化这三个位置?因为他们需要前面三个位置的值,如果不初始化,会越界。

4、填表顺序:

从 dp[3] 开始一直填充到 dp[n]。

5、返回值:

返回 dp[n],因此要多创建一个位置的空间,同时由于结果可能很大,要对 dp[n] 模 1000000007 取余。

2、代码

class Solution {
public:
    int waysToStep(int n) {
        if(n == 1) return 1;
        if(n == 2) return 2;

        // 1、创建dp表
        vector<int> dp(n + 1);
        
        // 2、初始化
        dp[0] = 1;
        dp[1] = 1;
        dp[2] = 2;

        // 3、填表
        for(int i = 3; i<n+1; ++i)
            dp[i] = ((dp[i-1] + dp[i-2]) % 1000000007 + dp[i-3]) % 1000000007;

        // 4、确定返回值
        return dp[n];
        
    }
};

  题四 解码方法

91. 解码方法 - 力扣(LeetCode)

1、算法解析

1、确定状态:

定义 dp[i] 数组中的值到底表示什么意思:dp[i]的值,就是以i为结尾的编码串的最多解码方式

2、状态转移方程:

因此,状态转移方程为:
dp[i] = dp[i-1] + dp[i-2] 

3、初始化:

为什么初始化这几个位置?因为他们需要前面三个位置的值,如果不初始化,会越界。

4、填表顺序:

从 dp[3] 开始一直填充到 dp[n]。

5、返回值:

返回 dp[n]

2、代码

class Solution {
public:
    int numDecodings(string s) {
    //1、创建dp表
    int n = s.size();
    vector<int> dp(n);

    //只有一位
    dp[0] = s[0] == '0' ? 0 : 1;
    if(n == 1 ) return dp[0];

    //2、初始化
    //根据判断条件进行初始化
    if(s[0] != '0' && s[1] != '0') dp[1]++;
    int m = (s[0] - '0')*10 + (s[1] - '0');//组合编码
    if(m>=10 && m <= 26)
        dp[1] ++;

    //3、填表
    for(int i = 2; i<n; ++i)
    {
        //i位置单独编码
        if( s[i] != '0') dp[i] += dp[i-1];
        //i和i-1位置组合编码
        int x = (s[i-1] - '0')*10 + (s[i] - '0');
        if(x >= 10 && x <= 26) dp[i] += dp[i-2];
    }

    //4、返回值
    return dp[n-1];

    }
};

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

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

相关文章

Git 命令行快速入门

前言 &#xff08;1&#xff09;新手个人建议使用TortoiseGit这类图形化界面来上手学习。 &#xff08;2&#xff09;如果一定需要用命令行进行操作&#xff0c;可以按照B站&#xff1a;程式与网页开发者必备技能&#xff01;Git 和 GitHub 零基础快速上手&#xff0c;轻松掌握…

odoo模型继承

odoo模型继承 模块化是Odoo一个非常重要的功能。一个模块通常定义一块业务内容&#xff0c;模块之间是可以交互的。所以从已有模块中去继承修改原有模块功能就很有必要。 Odoo中&#xff0c;模型之间也定义了一套继承的逻辑&#xff0c;目前有三种继承方 式&#xff1a; 1、…

学习测试7-ADB的使用

ADB是什么&#xff1f; ADB&#xff0c;即 Android Debug Bridge&#xff08;安卓调试桥&#xff09; 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具&#xff0c;它可为各种设备操作提供便利&#xff0c;如安装和调试应用&#xff0c;并提供对 Unix shell&…

ScrapySharp框架:小红书视频数据采集的API集成与应用

引言 随着大数据时代的到来&#xff0c;数据采集成为了互联网企业获取信息的重要手段。小红书作为一个集社交和电商于一体的平台&#xff0c;其丰富的用户生成内容&#xff08;UGC&#xff09;为数据采集提供了丰富的资源。本文将介绍如何使用ScrapySharp框架进行小红书视频数…

FLinkCDC引起的生产事故(二)

背景&#xff1a; 最近在做实时数据的抽取工作&#xff0c;利用FLinkCDC实时抽取目标库Oracle的数据到Doris中&#xff0c;但是在抽取的过程中&#xff0c;会导致目标库的生产库数据库非常卡顿&#xff0c;为了避免对生产环境的数据库造成影响&#xff0c;对生产环境的数据库利…

BJT交流分析+共发射极(CE)放大器+单片机的中断系统(中断的产生背景+使用中断重写秒表程序+中断优先级)

2024-7-10&#xff0c;星期三&#xff0c;16:58&#xff0c;天气&#xff1a;阴&#xff0c;心情&#xff1a;晴。今天终于阴天啦&#xff0c;有点风凉快一点了&#xff0c;不然真要受不了了&#xff0c;然后没有什么特殊的事情发生&#xff0c;继续学习啦&#xff0c;加油加油…

物流数据分析成本利润计算软件,佳易王物流货运单管理系统操作教程

前言&#xff1a; 物流数据分析成本利润计算软件&#xff0c;佳易王物流货运单管理系统操作教程 以下软件操作教程以&#xff0c;佳易王物流单统计分析软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 一、软件操作教程 1、佳易王物流货运…

原生小程序生成二维码方法之一

效果图&#xff1a; 第一步&#xff1a;下载对应的包并构建&#xff08;工具---》构建npm&#xff09; npm install weapp-qrcode --save 第二步&#xff1a;在wxml页面声明canvas <canvas style"width: 200px; height: 200px;margin:0 auto;" canvas-id"myQ…

【QT】QComboBox允许输入查询,且不区分大小写

目录 0.简介 1.环境 2.详细代码 3.参考 0.简介 项目需求&#xff0c;原本有一个下拉框&#xff0c;但是条目太多&#xff0c;不好搜索&#xff0c;所以用户要求可以输入查找 修改前 &#xff1a; 修改后&#xff1a; 1.环境 windows11 vs-code qt5.12 2.详细代码 QComboB…

常用网络概念

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ​​ 目录 了解组织 局域网技术 …

将文档做成试卷生成小程序

&#x1f449;将文档题库导入&#xff0c;轻松开启题目随机组卷&#xff0c;生成考试试卷 &#x1f449;创建考试&#xff0c;从题库中抽取试题&#xff0c;配置分值&#xff0c;组成标准的试卷 &#x1f449;如果想要在线组织答题考试的话&#xff0c;进入到考试详情页面&…

大数据信用评分太低,是什么原因引起的?

在大数据时代&#xff0c;个人的大数据信用评分变得尤为重要。它不仅影响着我们能否顺利地获得贷款、信用卡等金融服务&#xff0c;还在很多方面影响着我们的日常生活。那么&#xff0c;哪些原因可能会导致我们的大数据信用评分降低呢?本文将对此进行详细的总结&#xff0c;一…

从0开始搭建Spring-Cloud若依项目开发环境

文章目录 1. 安装Java开发环境配置环境变量 2. Maven安装环境变量配置setting文件配置 3. MySQL安装与配置环境变量配置配置MySQLNavicat配置Idea配置 4. redis安装配置1. 下载Redis安装包2. 安装Redis3. 启动Redis服务4. 配置Redis 5. Nacos环境修改配置文件启动Nacos服务服务…

数一140+上岸|七月强化一定要避开这3个雷区!

当然可以&#xff0c;强化阶段的主要任务就是做题&#xff01; 但是不用一刀切&#xff0c;强化阶段听课和做题可以二八原则&#xff0c;就是听课占20%&#xff0c;做题占80%。 因为自己去自学讲义的话&#xff0c;比如张宇18讲&#xff0c;会漏掉一些重点&#xff0c;有的技…

机器视觉/自然语言/生成式人工智能综合应用实验平台-实训平台-教学平台

AIGC是人工智能1.0时代进入2.0时代的重要标志&#xff0c;MIT 科技评论也将Al合成数据列为2022年十大突破性技术之一&#xff0c;甚至将生成性Al(Generative Al) 称为是AI领域过去十年最具前景的进展。同时&#xff0c;AIGC领域岗位需求数量暴涨。高校方面在人工智能专业与机器…

常见的嵌入式软件体系结构

本文介绍常见的嵌入式软件体系结构。 在嵌入式开发过程中&#xff0c;尤其是MCU为主控的项目开发中&#xff0c;实时性是需要考虑的重要因素&#xff0c;本文介绍常见的2种嵌入式软件体系结构&#xff0c;并对其优缺点作简要分析&#xff0c;另外&#xff0c;还对它们的软件层…

❤️‍FlyFlow: 新增异步子流程节点

FlyFlow 介绍 官网地址&#xff1a;www.flyflow.cc 演示网址&#xff1a;pro.flyflow.cc FlyFlow 借鉴了钉钉与飞书的界面设计理念&#xff0c;致力于打造一款用户友好、快速上手的工作流程工具。相较于传统的基于 BPMN.js 的工作流引擎&#xff0c;我们提供的解决方案显著简…

为什么要考国际人力资源证书?HR不能不知道!

在人力资源领域中&#xff0c;持有专业的人力资源证书并非铁律般的必需。但不容忽视的是&#xff0c;随着时代的进步和行业的不断演进&#xff0c;越来越多的人力资源专业人员开始重视并追求人力资源资格认证。 一张高含金量的证书让HR在求职市场上更具竞争力&#xff0c;更能…

GenAI 技术堆栈架构师指南 - 十种工具

这篇文章于 2024 年 6 月 3 日首次出现在 The New Stack 上。 我之前写过关于现代数据湖参考架构的文章&#xff0c;解决了每个企业面临的挑战——更多的数据、老化的Hadoop工具&#xff08;特别是HDFS&#xff09;以及对RESTful API&#xff08;S3&#xff09;和性能的更大需求…

Python编写的俄罗斯方块小游戏

文章目录 游戏页面实现代码 游戏页面 左右键移动方块位置&#xff0c;上键切换方块形态。 实现代码 import pygame import random# 初始化 Pygame pygame.init()# 定义颜色 colors [(0, 0, 0), # 黑色(255, 0, 0), # 红色(0, 255, 0), # 绿色(0, 0, 255), # 蓝色(255,…