【动态规划】dp之斐波那契数列模型

news2024/12/23 0:42:26

学习编程就得循环渐进,扎实基础,勿在浮沙筑高台  

 循环渐进Forward-CSDN博客


目录

 循环渐进Forward-CSDN博客

第N个泰波那契序数

 思路:

代码实现:

三步问题

思路:

代码实现:

使用最小花费爬楼梯

思路:

代码实现:

解码方法

思路:

代码实现:

总结:


动态规划有许多模型,根据这些模型可以再细分专题来训练动态规划问题。

第N个泰波那契序数

LeetCode网做题链接:1137. 第 N 个泰波那契数 - 力扣(LeetCode)

 思路:

        分为五步进行,

        第一找出状态表示,这一步需要根据题目要求以及做题经验。以第i个位置为结尾+题目要求。

        第二找到状态转移方程,根据最近的一步推导出dp[i],划分问题

        第三初始化,因为有可能导致dp表越界,所以要对dp[1]和dp[0]进行初始化。

        第四填表顺序,因为是以i为结尾,所以是从左往右进行填表。

        第五是返回dp表。

代码实现:

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;

        for(int i=3;i<=n;i++)
        {
            dp[i]=dp[i-1]+dp[i-2]+dp[i-3];
        }

        return dp[n];
    }
};

 移动思路:

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

三步问题

LeetCode做题链接:面试题 08.01. 三步问题 - 力扣(LeetCode)

思路:

分为五步进行,

        第一找出状态表示,这一步需要根据题目要求以及做题经验。以第i个位置为结尾+题目要求。

        第二找到状态转移方程,根据最近的一步推导出dp[i],划分问题

        第三初始化,因为有可能导致dp表越界,所以要对dp[1]和dp[0]和dp[2]进行初始化。

        第四填表顺序,因为是以i为结尾,所以是从左往右进行填表。

        第五是返回dp表。

代码实现:

class Solution {
public:

    int waysToStep(int n) {
        const int N=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])%N +dp[i-3])%N;
        }

        return dp[n];
    }
};

细节问题:因为题目说明可能得数会很大,因此需要对结果进行取模操作。


使用最小花费爬楼梯

LeetCode做题链接:746. 使用最小花费爬楼梯 - 力扣(LeetCode)

思路:

分为五步进行,

        第一找出状态表示,这一步需要根据题目要求以及做题经验。以第i个位置为起点+题目要求。

        第二找到状态转移方程,根据最近的一步推导出dp[i],划分问题

        第三初始化,因为有可能导致dp表越界,所以要对dp[1]和dp[0]和dp[2]进行初始化。

        第四填表顺序,因为是以i为起点,所以是从右往左进行填表。

        第五是返回dp表。

代码实现:

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

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

        return min(dp[0],dp[1]);
    }
};

解码方法

LeetCode做题链接:91. 解码方法 - 力扣(LeetCode)

思路:

分为五步进行,

        第一找出状态表示,这一步需要根据题目要求以及做题经验。以第i个位置为结尾+题目要求。

        第二找到状态转移方程,根据最近的一步推导出dp[i],划分问题

        第三初始化,因为有可能导致dp表越界,所以要对dp[1]和dp[0]和dp[2]进行初始化。

        第四填表顺序,因为是以i为结尾,所以是从左往右进行填表。

        第五是返回dp表。

代码实现:

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++)
        {
            if(s[i-1]!='0') dp[i]+=dp[i-1];
            int t=(s[i-2]-'0')*10+s[i-1]-'0';
            if(t>=10 && t<=26)dp[i]+=dp[i-2];
        }

        return dp[n];
    }
};

总结:

        做题下来发现,规律较为死板,总体分为五步进行,最重要的是找出状态转移方程,写出状态转移方程的重点在于如何找出离结果最近的那几步操作。


 学习编程就得循环渐进,扎实基础,勿在浮沙筑高台


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

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

相关文章

C语言 | 第十三章 | 二维数组 冒泡排序 字符串指针 断点调试

P 120 数组应用案例 2023/1/29 一、应用案例 案例一&#xff1a;创建一个char类型的26个元素的数组&#xff0c;分别 放置’A’-Z‘。使用for循环访问所有元素并打印出来。提示&#xff1a;字符数据运算 ‘A’1 -> ‘B’ #include<stdio.h>void main(){/*创建一个c…

【优选算法之BFS】No.15--- 经典BFS解决FloodFill算法和解决最短路问题

文章目录 前言一、BFS解决FloodFill算法示例&#xff1a;1.1 图像渲染1.2 岛屿数量1.3 岛屿的最⼤⾯积1.4 被围绕的区域 二、BFS解决最短路问题2.1 迷宫中离⼊⼝最近的出⼝2.2 最⼩基因变化2.3 单词接⻰2.4 为⾼尔夫⽐赛砍树 前言 &#x1f467;个人主页&#xff1a;小沈YO. &a…

Linux高级编程_31_消息队列

文章目录 消息队列作用&#xff1a;特点&#xff1a;消息队列限制值&#xff1a;注意&#xff1a;命令&#xff1a;ftok函数作用&#xff1a;语法&#xff1a; msgget函数作用&#xff1a;语法&#xff1a; msgsnd函数作用&#xff1a;语法&#xff1a; msgrcv函数作用&#xf…

QT实现QInputDialog中文按钮

这是我记录Qt学习过程心得文章的第三篇&#xff0c;主要是为了方便QInputDialog输入框的使用&#xff0c;通过自定义的方式&#xff0c;按钮中文化&#xff0c;统一封装成一个函数&#xff0c;还是写在了Skysonya类里面。 实现代码&#xff1a; //中文按钮文本输入对话框 QSt…

【gRPC】1—gRPC是什么

gRPC是什么 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; &#x1f4d6;RPC专栏&#xff1a;https://b…

鸿蒙--播放器状态控制

各个页面共享同一个播放状态&#xff0c;而且可以互相控制&#xff0c;如果传递来传递去会非常的麻烦&#xff0c;但是他们都是Tabs组件内的&#xff0c;我们在index页面提供一个状态&#xff0c;在各个组件接收即可 创建两个子组件&#xff0c;一个是播放控制的子组件&#xf…

1. Oracle 安装报错——环境变量过长

文章目录 1. 报错详细信息2. 解决方案2.1 方案一&#xff1a;修改配置文件cvu_prereq.xml2.2 方案二&#xff1a;修改环境变量配置 1. 报错详细信息 安装 Oracle 过程中&#xff0c;在执行 “先决条件检查” 时报错&#xff1a; 报错内容&#xff1a; This test checks wheth…

【自然语言处理】(3) --RNN循环神经网络

文章目录 RNN循环神经网络一、传统神经网络的问题二、RNN的基本结构三、计算过程4. RNN的局限 总结 RNN循环神经网络 循环神经网络&#xff08;RNN&#xff0c;Recurrent Neural Network&#xff09;是一种用于处理序列数据的神经网络模型。其关键特性在于网络节点&#xff08…

现代数字信号处理I-P2概率论学习笔记

目录 学习视频链接&#xff1a; 1. 三要素及关系 2. 期望和方差的定义及基本性质 2.1 期望&#xff08;均值&#xff09;定义&#xff1a; 在实际工作中很难获得随机变量的分布或者概率密度&#xff0c;用矩描述随机变量 2.2 期望基本性质&#xff1a; 2.3 方差定义 2.…

Android Studio Koala Feature Drop 稳定版现已推出

作者 / Android Studio 产品经理 Sandhya Mohan Android Studio Koala Feature Drop (2024.1.2) 现已推出&#xff01;&#x1f428; &#x1f517; Android Studio https://developer.android.google.cn/studio 今年早些时候&#xff0c;我们宣布每个 Android Studio 动物版本…

10月9日笔记(域内用户登录凭据窃取)

缺&#xff1a;BloodHound自动化分析域环境未实现&#xff08;环境问题&#xff09; 获取常见应用软件凭据 为了扩大可访问的范围&#xff0c;测试人员通常会搜索各种常见的密码存储位置&#xff0c;以获取用户凭据。一些特定的应用程序可以存储密码&#xff0c;以方便用户管…

python的特殊方法——魔术方法

前言 __init__(self[]) ​编辑 __call__(self [, ...]) __getitem__(self, key) __len__(self) __repr__(self) / __str__(self) __add__(self, other) __radd__(self, other) 参考文献 前言 官方定义好的&#xff0c;以两个下划线开头且以两个下划线结尾来命名的方法…

PostgreSQL学习笔记四:GUI管理工具

PostgreSQL 是一款广泛使用的开源关系数据库管理系统&#xff0c;拥有许多图形用户界面&#xff08;GUI&#xff09;工具来帮助用户更高效地管理数据库。以下是一些流行的 PostgreSQL 管理工具&#xff1a; pgAdmin&#xff1a; 一个流行的开源 PostgreSQL GUI 工具&#xff0c…

处理“navicat premium 2003 - 无法在 192.168.10.140 上连接到 MySQL 服务器(10060“未知错误“)”的问题:

以下是一些可能的解决方法来处理“navicat premium 2003 - 无法在 192.168.10.140 上连接到 MySQL 服务器&#xff08;10060"未知错误"&#xff09;”的问题&#xff1a; **一、检查 MySQL 服务状态** 1. 确认 MySQL 服务是否正在运行。你可以在服务器上通过任务管…

Django makemigrations时出现TypeError: ‘module‘ object is not iterable

使用Python 3.11、Django 5.1.2 写完model进行makemigrations时出现报错 报错的最下面提到了我自己创建的一个应用里的urls.py&#xff0c;尝试着给里面加上一个列表 然后问题解决了。。。 不知道为什么 makemigrations的时候会去检查urls。。。

mybatisPlus对于pgSQL中UUID和UUID[]类型的交互

在PGSQL中&#xff0c;有的类型是UUID和UUID[]这种类型&#xff0c;在mybatis和这些类型交互的时候需要手动设置类型处理器才可以&#xff0c;这里记录一下类型处理器的设置 /*** UUID类型处理器*/ public class UUIDTypeHandler extends BaseTypeHandler<UUID> {/*** 获…

Kubernetes中的pod管理及优化

华子目录 什么是pod1.创建自主式pod&#xff08;生产不推荐&#xff09;优点缺点示例1示例2示例3示例4 2.利用控制器管理pod&#xff08;推荐&#xff09;应用版本的更新 3.利用yaml文件部署应用优点3.1yaml配置文件参数3.2如何获取资源帮助 yaml文件编写示例1.运行简单的单个容…

实现std::sort,replace,fill,accumulate,equal等函数

std::sort /// <summary>/// std::sort 是从小到大排列的/// </summary>/// <typeparam name"IteratorClass"></typeparam>/// <typeparam name"ComparingFunctions"></typeparam>/// <param name"itBegin&qu…

PAT甲级-1150 Travelling Salesman Problem

题目 题目大意 旅行商问题是NP-hard问题&#xff0c;即没有多项式时间内的解法&#xff0c;但是可以验证答案是否正确。给定一个无向图&#xff0c;判断简单环&#xff0c;复杂环和非环。对应“TS simple cycle”、“TS cycle”、“Not a TS cycle”。还要求出环的最小路径权值…

力扣11-盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。…