动态规划(算法)---01.斐波那契数列模型_第N个泰波那契数

前言:

  有一个很著名的公式 “程序=数据结构+算法”。

  算法是模型分析的一组可行的,确定的,有穷的规则。通俗的说,算法也可以理解为一个解题步骤,有一些基本运算和规定的顺序构成。但是从计算机程序设计的角度看,算法由一系列求解问题的指令构成,能根据规范的输入,在有限的时间内获得有效的输出结果。算法代表了用系统的方法来描述解决问题的一种策略机制。

  完成同一件事的不同的算法完成的时间和占用的资源可能并不相同,这就牵扯到效率的问题。算法的基本任务是针对一个具体的问题,找到一个高效的处理方法,从而完成任务。而这就是我们的责任了。

 学习算法我这里先从动态规划开始,先以基础题目入手,逐渐增加难度,了解解决动态规划算法题的一个简单流程,先用简单几道题入门。

我们先以斐波那契数列模型_第N个泰波那契数这道题为例:https://leetcode.cn/problems/n-th-tribonacci-number/description/

一、题目解析

  这道题是斐波那契数列的加强版,具体改动在元素下标从0开始,这里稍微注意就好。并且从第四个数开始,每个数的值等于前三项元素的和,也就是Tn = Tn-3 + Tn-2 + Tn-1 

  题目要求我们返回Tn的值。

二、算法原理

1、状态表示

  我们在状态标识的时候,一般都会创建一个数组dp,也就是我们所说的dp表,我们要做的就是把每一个状态的值填入这个表内,最终这个表内的某一个值可能就是我们要返回的值。 

  状态简单理解就是dp表内某一个值代表的含义。

如何确定状态表示

  • 题目要求

简单的题目里一般会给出

  • 经验+题目要求

越学越深入,动态规划也是熟能生巧,在题目中没有明显给出的时候,我们就要凭借自己做题的经验来确定,所以就需要我们大量的做题。

  • 分析问题的过程中,发现重复子问题

  分析问题的过程中把重复子问题抽象成我们的状态表示,这个更难理解,一切的基础都是我们先对动态规划算法熟练运用。我也不懂,我们慢慢来。


  那我们这道题的状态表示是什么呢?我们第一次学也可以看得出来,就是第n个泰波那契的值,所以,我们创建一个一维数组dp,让dp[0]的值代表第0个泰波那契数的值,dp[1]的值代表第1个泰波那契数的值,dp[n]的值代表第n个泰波那契数的值。dp[0]代表的是第0个泰波那契数的值原因是我们泰波那契数列下标是从0开始的。

  可知,状态表示为:dp[i]表示第i个泰波那契的值

  有了状态表示才有之后的对状态转移方程的推导,所以这一步最为重要!

2、状态转移方程

  确定状态表示之后我们就可以根据状态标识推出状态转移方程

  状态转移方程是什么?

不讲什么复杂的,简单来说状态转移方程就是    dp[i]等于什么 dp[i]=?

  这个就是状态转移方程,我们要做的,就是推出dp[i]等于什么

  我们根据状态表示结合题目+经验去推理转移方程,这一步也是我们整个解题过程中最难的一步

  我们在这道题先简单了解下什么是状态转移方程,之后比较难的题目再细推

  这道题我们根据状态表示和题目,我们就可以知道dp[i]=dp[i-1]+dp[i-2]+dp[i-3],这就是我们的状态转移方程。

3、初始化

  我们创建dp表就是为了把他填满,我们初始化是为了防止在填表的过程中越界

  怎么谈越界?

  在这道题中,我们知道一个泰波那契数的值等于其前三个泰波那契的值的和,我们根据状态转移方程可知,dp[i]=dp[i-1]+dp[i-2]+dp[i-3] ,那当我们填dp[0]、dp[1]、dp[2]的时候,其实是存在越界的,所以我们为了防止越界,就要先去解决越界,由题可知,dp[0]、dp[1]、dp[2]的值我们已知,所以我们就可以先把这三个值填入dp表,这样在之后填表的时候就不会有越界问题发生,因为其前三个值都会存在!

把这三个值填入表中,解决越界问题,这个就叫dp表的初始化

4、填表顺序

  注意填表顺序,是因为我们需要在填当前状态的时候,所需要的状态已经计算过了

  这个意思就是,我们在填状态dp[3]的时候,我们就已经知道其所需要的dp[0]、dp[1]、dp[2]状态的值了, 那假如我们呢直接填dp[4],可其所需要的状态dp[3]我们还没填,所以就计算不出来我们当前状态dp[4]的值,所以填表顺序也是需要考虑的一项

  这道题的填表顺序就是我们需要从状态dp[3]开始,依次填表。

5、返回值

  返回值就是我们最后需要求出的值,在这里也就是我们我们的dp[n]。返回值一般通过题目要求和状态表示来判断出来。

  以上就是我们算法原理的五步,这五步完成,其实我们就已经可以解题了。

三、编写代码

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

 问题解释:

  •   这里的细节问题是因为当n<3时,在填表部分会有越界问题发生,所以在此前面对其进行细节处理。
  •   创建dp表时,将其大小设置为n+1,是因为泰波那契数下标是从0开始的。

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

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

相关文章

【C++】牛客 ——NC138 矩阵最长递增路径

✨题目链接&#xff1a; NC138 矩阵最长递增路径 ✨题目描述 给定一个 n 行 m 列矩阵 matrix &#xff0c;矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径&#xff0c;使这条路径上的元素是递增的。并输出这条最长路径的长度。 这个路径必须满足以下条件&#…

Django项目从创建到开发以及数据库连接的主要步骤,精简实用

1、项目创建 安装命令&#xff1a;pip install django3 -i <https://pypi.tuna.tsinghua.edu.cn/simple>上述命令是使用清华镜像&#xff0c;安装django3在项目的创建目录执行命令&#xff1a;django-admin startproject 项目名称&#xff08;英文&#xff09;就可以在指…

ubuntu18 安装sudo

ubuntu18 安装sudo 在Ubuntu 18.04上安装sudo通常是不必要的&#xff0c;因为sudo是Ubuntu及其衍生版本的基本包之一&#xff0c;默认情况下就已经安装。如果出于某种原因&#xff0c;sudo没有预装或者你需要升级到最新版本&#xff0c;你可以通过以下命令安装或更新它&#x…

【STM32项目】基于stm32智能鱼缸控制系统的设计与实现(完整工程资料源码)

实物演示效果 基于stm32智能鱼缸控制系统的设计与实现 目录&#xff1a; 实物演示效果 目录&#xff1a; 一、 绪论 1.1 项目研究目的及意义 1.1.1 选题目的 1.1.2 选题意义 1.2 国内外研究现状 1.2.1 国外发展现状 1.2.2 国内发展现状 1.3 项目研究内容 二、智能鱼缸系统总体设…

一文读懂Linux

前言 为了便于理解&#xff0c;本文从常用操作和概念开始讲起。虽然已经尽量做到简化&#xff0c;但是涉及到的内容还是有点多。在面试中&#xff0c;Linux 知识点相对于网络和操作系统等知识点而言不是那么重要&#xff0c;只需要重点掌握一些原理和命令即可。为了方便大家准…

2024年5月19日优雅草蜻蜓K知识付费系统旗舰版v1.0.9进度更新

v1.1.0更新 v1.1.0更新 2024年5月19日优雅草蜻蜓K知识付费系统旗舰版v1.0.9进度更新&#xff0c;首页体育栏目完善新增用户发布页面 开发进度 首页体育栏目完善 新增用户发布页面 新增用户登录完善 新增学习课程页面完善-过往课程数据完成 去掉其他三方登录&#xff0c;新增…

团队代码质量利器:ESLint 搭配 Prettier

一个中大型项目&#xff0c;一般由团队成员共同开发维护。但每个开发人员都有独特的代码编写风格和不同的文本编辑器。那么如何解决同一项目中有太多不同编码风格的问题&#xff1f;如何实现相同的编码风格&#xff0c;避免团队成员之间的许多警告呢&#xff1f; 答案就是&…

Web Accessibility基础:构建无障碍的前端应用

Web Accessibility&#xff08;网络无障碍&#xff09;是确保所有人都能平等访问和使用网站和应用程序的关键。这包括视觉、听觉、运动和认知能力有限的用户。以下是一些构建无障碍前端应用的基础原则和代码示例&#xff1a; 2500G计算机入门到高级架构师开发资料超级大礼包免…

list stream 改变list属性的值

在Java中&#xff0c;如果你想使用Stream API来改变List中对象的某个属性值&#xff0c;需要注意的是&#xff0c;Stream API本身设计为不可变操作&#xff0c;即它不直接修改原有的集合&#xff0c;而是产生一个新的流或集合。但是&#xff0c;你可以通过流操作来创建一个新的…

java文档管理系统的设计与实现源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的文档管理系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 文档管理系统的…

第二证券今日投资参考:5月国产游戏版号发放 猪价加速上涨

昨日&#xff0c;两市股指盘中震荡上扬&#xff0c;沪指盘中续创年内新高&#xff0c;创业板指一度涨超1%。到收盘&#xff0c;沪指涨0.54%报3171.15点&#xff0c;深证成指涨0.43%报9750.82点&#xff0c;创业板指涨0.59%报1875.93点&#xff0c;上证50指数涨0.34%&#xff1b…

小程序-收货地址管理模块实现

页面结构代码&#xff1a; address-form.vue --->新建地址和修改地址页面 <template><view class"content"><form><!-- 表单内容 --><view class"form-item"><text class"label">收货人</text>…

注册/认证小程序为什么验证失败

​很多商家在注册/认证小程序时&#xff0c;经常会出现各种验证失败的情况。其中可能是工商总局数据没更新&#xff0c;也有可能是商家填写的信息有误。下面具体分析一下这些情况。 一、工商数据没有更新或存在异常。 微信平台是直接拉取国家工商总局的数据&#xff0c;工商数…

Python 中文编码问题

Python 输出 "Hello, World!"&#xff0c;英文没有问题&#xff0c;但是如果你输出中文字符 "你好&#xff0c;中国" 就有可能会碰到中文编码问题。 Python 文件中如果未指定编码&#xff0c;在执行过程会出现报错&#xff1a; print ("你好&#x…

登录安全分析报告:创蓝云智注册

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

vue 组件中 data 为什么必须是函数

在 Vue 中&#xff0c;组件的 data 必须是一个函数而不是一个对象&#xff0c;这是因为 Vue 组件是可复用的&#xff0c;并且每个组件实例都需要拥有自己独立的数据状态。如果 data 是一个对象&#xff0c;那么这个对象在多个组件实例之间将是共享的&#xff0c;这会导致所有的…

# 分布式链路追踪_skywalking_学习(1)

分布式链路追踪_skywalking_学习&#xff08;1&#xff09; 一、APM 系统概述 1、什么是 APM 系统&#xff1f; APM &#xff1a;全称 Application Performance Management 即应用性能管理系统。是对企业系统即时监控以实现对应用程序性能管理和故障管理的系统化的解决方案。…

移动端常用meta

在移动端开发中&#xff0c;<meta> 标签用于提供关于HTML文档的元数据&#xff0c;这些元数据不会显示在页面上&#xff0c;但可以被浏览器解析&#xff0c;用于控制页面的行为和外观。以下是一些在移动端开发中常用的 标签&#xff1a; 1. 视口设置 这是移动端开发中最…

安卓手机APP开发__Wi-Fi扫描概述

安卓手机APP开发__Wi-Fi扫描概述 目录 概述 Wi-Fi的扫描过程 限制 权限 Android 8.0 and Android 8.1: Android 9: Android 10 (API 级别 29) 和 更高版本: 扫描频率的限制 Android 8.0 and Android 8.1: Android 9: Android 10 and higher: 概述 你能使用Wi-Fi的…

Flutter 中的 ValueListenableBuilder 小部件:全面指南

Flutter 中的 ValueListenableBuilder 小部件&#xff1a;全面指南 在 Flutter 应用开发中&#xff0c;响应数据变化并更新 UI 是一个常见的需求。ValueListenableBuilder 是 Flutter 提供的一个非常有用的小部件&#xff0c;它允许你根据 ValueListenable 的值自动更新 widge…