【动态规划精选题目】1、斐波那契数列模型

news2024/7/6 18:09:41

 

此动态规划系列主要讲解大约10个系列【后续持续更新】

本篇讲解入门级:斐波那契模型,会在讲解题目同时给出AC代码

为什么叫斐波那契数列模型?因为本篇4道题的状态转移方程都跟斐波那契递推方程差不多,但这点不重要,请往下看

目录

 1、泰波那契数

2、三步问题

3、使用最小花费爬楼梯

4、解码方法


 1、泰波那契数

  我们动态规划首先是填dp表,填满dp表后,里面的某个值就是我们要求的最终结果(本题很简单,状态转移方程都直接给你了)

class Solution {
public:
    int tribonacci(int n) {
        //1、创建dp数组
        //2、初始化
        //3、填表
        //4、返回值

        //处理一下边界情况,若不处理下面到转移方程那里会越界
        if (n == 0) return 0;
        if (n == 1 || n == 2) return 1;

        vector<int> dp(n + 1);//多开一个,因为我们会算到第n个数
        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];//返回第n个泰波那契数
    }
};

 空间优化:

 因为我们上述代码中空间复杂度O(N),利用滚动数组思想可以实现O(1)

注:这种滚动数组我们以后笔试不要求,但是面试时可能有点研究价值,所以对于这个东西不用过分研究,但是注意后面讲解背包问题时会使用这个思想

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;
    }
};

2、三步问题

class Solution {
public:
    int waysToStep(int n) {
        //1、创建dp数组
        //2、初始化
        //3、填表
        //4、返回值

        const int MOD = 1e9 + 7;

        //处理边界条件
       if (n == 1 || n == 2) return n;
       if (n == 3) return 4;

        vector<int> dp(n + 1);
        dp[1] = 1, dp[2] = 2, dp[3] = 4;
        for (int i = 4; i <= n; i++)
        {
            //结果取模,必须对每一次加法的结果都取一次模,不能全加完再取模
            dp[i] = ((dp[i - 1] + dp[i - 2]) % MOD + dp[i - 3]) % MOD;
        }
        return dp[n];
    }
};

3、使用最小花费爬楼梯

解法一: 

 

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        //1、创建dp表
        //2、初始化
        //3、填表
        //4、返回值

        int n = cost.size();
        vector<int> dp(n + 1);//你不传初始值的话vector默认把值初始化为0

        for (int i = 2; i <= n ; i++)
        {
            //到第i个台阶的花费=min(到第i-2个台阶的最小花费后再跨两步的花费,
            //到第i-1个台阶的最小花费后再跨一步的花费)
            dp[i] = min(dp[i - 2] + cost[i - 2], dp[i - 1] + cost[i - 1]);
        }
        return dp[n];
    }
};

解法二:

 注:解法二不用多开一个位置,因为是把最后两个位置初始化后往前推,从而得出最终结果

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

        //从n-2到终点一定是一下跨两步,故cost[n - 2]即可
        dp[n - 1] = cost[n - 1], dp[n - 2] = cost[n - 2];
        for (int i = n - 3; i >= 0; i--)
        {
            dp[i] = cost[i] + min(dp[i + 1], dp[i + 2]);
        }
        return min(dp[0], dp[1]);
    }
};

 总结:

状态表示有很多种,但是状态表示是否对要看你能够写出状态转移方程求解出问题,动态规划的题目需要大量经验,经验足够后再写状态表示等就会很熟练了


4、解码方法

class Solution {
public:
    int numDecodings(string s) {
        int n = s.size();
        vector<int> dp(n);
        //初始化dp[0]
        dp[0] = s[0] != '0';//只要第一个字符不是'0',就可以单独编码
        if (n == 1) return dp[0];
        
        //初始化dp[1]
        if(s[0] != '0' && s[1] != '0') dp[1] += 1;//两数字可以单独编码的情况
        int con = (s[0] - '0') * 10 + s[1] - '0';
        //共同编码的结果在10~26就是成功的,因为0~9会有前导0,就失败了
        if (con >= 10 && con <= 26) dp[1] += 1;

        for (int i = 2; i < n; i++)
        {
            //计算以i位置结尾的解码方案数
            if (s[i] != '0') dp[i] += dp[i - 1];
            int con = (s[i - 1] - '0') * 10 + s[i] - '0';
            if (con >= 10 && con <= 26) dp[i] += dp[i - 2];
        }
        return dp[n - 1];
    }
};

 优化:

 因为在计算以1位置结尾时的解放方案数与在计算从2位置往后的代码类似,所以我们可以做一个优化,让以1位置结尾的计算也在for循环中进行

class Solution {
public:
    int numDecodings(string s) {
        //优化

        int n = s.size();
        vector<int> dp(n + 1);
        dp[0] = 1;//保证后续填表正确
        dp[1] = s[1 - 1] != '0';

        for (int i = 2; i <= n; i++)
        {
            //计算以i位置结尾的解码方案数
            if (s[i - 1] != '0') dp[i] += dp[i - 1];
            int con = (s[i - 2] - '0') * 10 + s[i - 1] - '0';
            if (con >= 10 && con <= 26) dp[i] += dp[i - 2];
        }
        return dp[n];
    }
};

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

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

相关文章

Python 全栈体系【四阶】(四)

第四章 机器学习 一、人工智能概述 1. 什么是人工智能 人工智能&#xff08;Artificial Intelligence&#xff09;是计算机科学的一个分支学科&#xff0c;主要研究用计算机模拟人的思考方式和行为方式&#xff0c;从而在某些领域代替人进行工作。 2. 人工智能的学科体系 …

Unity-小工具-LookAt

Unity-小工具-LookAt &#x1f959;介绍 &#x1f959;介绍 &#x1f4a1;通过扩展方法调用 gameObject.LookAtTarget&#xff0c;让物体转向目标位置 &#x1f4a1;gameObject.StopLookat 停止更新 &#x1f4a1;可以在调用时传入自动停止标记&#xff0c;等转向目标位置后自…

conda环境下ImportError: libmkl_intel_lp64.so.1: cannot open shared object file问题解决

1 问题描述 conda环境下运行模型推理&#xff0c;出现如下错误&#xff1a; (retalking) [rootlocalhost video-retalking]# python inference.py --face examples/face/01.mp4 --audio examples/audio/01.wav --outfile results/01.mp4 Traceback (most recent call last):F…

Fiddler中AutoResponder的简单使用

AutoResponder&#xff0c;自动回复器&#xff0c;用于将 HTTP 请求重定向为指定的返回类型。 这个功能有点像是一个代理转发器&#xff0c;可以将某一请求的响应结果替换成指定的资源&#xff0c;可以是某个页面也可以是某个本地文件 1.使用 打开“Fiddler”&#xff0c;点击…

LeedCode刷题---滑动窗口问题

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、长度最小的子数组 题目链接&#xff1a;长度最小的子数组 题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。…

MySQL执行流程_执行一条select语句,期间发生了什么

文章目录 执行一条select语句&#xff0c;期间发生了什么MySQL执行流程第一步&#xff1a;连接器第二步&#xff1a;查询缓存第三步&#xff1a;解析SQL第四步&#xff1a;执行SQL 执行一条select语句&#xff0c;期间发生了什么 MySQL执行流程 server层负责建立连接、分析和执…

GraphSAGE 到底在训练什么? 图上的Mini-Batch 是怎么训练的 ?

1. 一个端到端的 同构图&#xff08;Cora数据集&#xff09;节点分类代码&#xff1a; import argparseimport dgl import dgl.nn as dglnnimport torch import torch.nn as nn import torch.nn.functional as F from dgl import AddSelfLoop from dgl.data import CiteseerGr…

YOLOv8训练好的pt文件如何用来预测

1. 使用原版预测 代码如下&#xff1a; from ultralytics import YOLO# Load a model model YOLO(yolov8n.pt) # load an official model# Predict with the model results model(https://ultralytics.com/images/bus.jpg) # predict on an image命令如下&#xff1a; y…

linux 17day 堡垒机 堡垒机下载 堡垒机安装 堡垒机使用 堡垒机管理服务器 堡垒机管理数据库

目录 堡垒机官网堡垒机下载堡垒机安装堡垒机使用Linux系统上使用web 使用配置站点url配置邮箱创建要管理的服务器创建 特权用户用于管理创建普通用户添加命令过滤命令过滤创建好 之后就需要 给用户名 和管理添加web用户登录 添加数据库mysql 服务区创建用户创建系统用户创建mys…

CRM对小微公司的实际作用:从客户管理到业务拓展

公司作为一个组织&#xff0c;管理方面是重中之重。传统式的人力会是一个较为费时费力的大工程。随着科技的发展&#xff0c;CRM系统完全可以胜任企业管理的工作。那么&#xff0c;CRM有什么特点&#xff1f;对小微公司有哪些作用&#xff1f; 1、提高管理效率 传统的客户管理…

DataFunSummit:2023年数据治理在线峰会-核心PPT资料下载

一、峰会简介 数据治理&#xff08;Data Governance&#xff09;是组织中涉及数据使用的一整套管理行为。由企业数据治理部门发起并推行&#xff0c;关于如何制定和实施针对整个企业内部数据的商业应用和技术管理的一系列政策和流程。 数据治理是一个通过一系列信息相关的过程…

MySQL笔记-第09章_子查询

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第09章_子查询1. 需求分析与问题解决1.1 实际问题1.2 子查询的基本使用1.3 子查询的分类 2. 单行子查询2.1 单行比较操作符2.2 代码示例2.3 …

生化危机5无法启动丢失xlive.dll怎么修复?快速修复教程分享

xlive.dll丢失的5个解决方法与xlive.dll文件丢失原因以及xlive.dll丢失对电脑有什么影响介绍 一、xlive.dll文件丢失原因&#xff1a; 1. 病毒或恶意软件感染&#xff1a;某些病毒或恶意软件会删除或损坏系统文件中的xlive.dll文件&#xff0c;导致其丢失。 2. 误操作&#…

作业12.12

1.闹钟 主函数 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);t new QTimer(this);idstartTimer(1000);speecher new QTextToSpeech(this); }Widget::~Wid…

QML WebEngineView 全屏和退出

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在使用浏览器时,我们经常会用到全屏模式,最常见的场景有:观看视频、阅读文章、在线演示等。全屏模式的优点在于,它可以让用户充分地利用有限的屏幕空间,更好地专注于内容本身,从而提供丰富的沉浸式视觉…

视频剪辑入门:视频批量嵌套合并,成为视频编辑达人

随着数字媒体的快速发展&#xff0c;视频剪辑已经成为一项非常流行的技能。如果对视频剪辑感兴趣&#xff0c;想学习如何将多个视频批量嵌套合并&#xff0c;下面是云炫AI智剪批量嵌套合并视频的一些简单步骤&#xff0c;高效剪辑&#xff0c;成为视频编辑达人不再难。 准备要视…

金融银行软件测试超大型攻略,最受欢迎的金融银行大揭秘附面试题

零、为什么做金融类软件测试 举个栗子&#xff0c;银行里的软件测试工程师。横向跟互联网公司里的测试来说&#xff0c;薪资相对稳定&#xff0c;加班少甚至基本没有&#xff0c;业务稳定。实在是测试类岗位中的香饽饽&#xff01; 一、什么是金融行业 金融业是指经营金融商…

简单自定义vuex的设计思路

vuex集中式存储管理应用所有组件的状态&#xff0c;并以响应的规则保证状态以可预测的方式 发生变化。 步骤&#xff1a; 1.Store类&#xff0c;保存选项&#xff0c;_mutations&#xff0c;_actions&#xff0c;getters 2.响应式状态&#xff1a;new Vue方式设置响应式。 …

Java网络编程,使用UDP实现TCP(三), 基本实现四次挥手

简介 四次挥手示意图 在四次挥手过程中&#xff0c;第一次挥手中的Seq为本次挥手的ISN&#xff0c; ACK为 上一次挥手的 Seq1&#xff0c;即最后一次数据传输的Seq1。挥手信息由客户端首先发起。 实现步骤&#xff1a; 下面是TCP四次挥手的步骤&#xff1a; 第一次挥手&…

环境变量提权

环境变量提权 借鉴文章LINUX提权之环境变量提权篇 - 知乎 (zhihu.com) 利用条件 存在一个文件&#xff0c;利用su权限执行&#xff0c;普通用户可以执行此文件&#xff0c;但只限制在一个目录下可以执行 利用方式 将此文件的目录添加到环境变量中 export PATH/tmp:$PATHe…