千锤百炼算法系列之动态规划

题外话

这段时间,我必须把算法弄明白

这篇直接讲解动态规划所有细节!

前面那篇

千锤百炼之每日算法(一)-CSDN博客

也有关于动态规划的讲解,也非常详细

很简单,我成尊不就是了?!!!

正题

动态规划

这里我们主要是让大家明白什么是动态规划,怎么用动态规划解题

我就不用那些官方的东西了

让我们直接上例题!!

第n个泰波那契数

泰波那契序列 Tn 定义如下: 

T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2

给你整数 n,请返回第 n 个泰波那契数 Tn 的值。

先说一下动态规划的步骤

动态规划步骤

1.动态表示

我们所用的动态表示不同,进行下面步骤的时候也会有一些区别

一道题可能有多种动态表示,也有可能只有一种

什么是动态表示呢?

就是我们根据题目信息所找到的dp[i]

像这道题我们可以设置dp[i]为第i个位置的泰波那契值

2.动态转移公式

动态转移公式是根据动态表示和题目信息所得到的

所以动态表示不同,我们的动态哦转移公式肯定是不同的

那么动态转移公式是什么呢?

就是dp[i]等于从题目信息中提取出的信息所建立的公式

咱们这道题比较简单,动态转移公式相当于直接在题目中给出了

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

这很显而易见吧,相信大家都能理解嗷

3.初始化

①我们有了动态转移公式,但是我们没有值

我们需要从dp[0],dp[1],dp[2]一直算到dp[n],也就是从左到右的顺序

我们如果想求dp[3]的话是不是需要知道dp[0],dp[1],dp[2],它们三个的值

但是我们根本没有它们三个的值,所以这个时候就需要根据题干信息,然后将我们公式的起始点dp[0],dp[1],dp[2]进行初始化赋值

②除此之外,我们需要给i规定一个范围,大家想想

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

   这个公式中,i可以等于0吗?

   很显然不可以,数组越界了

   我们需要从i=3开始

4.填表顺序

填表顺序自然是从左到右,从头到尾计算

5.返回值 

根据题干要求找到正确的返回值

我们要求第n个泰波那契值

那么根据我们设立的动态表示

返回值就是dp[n]

代码详解

public int test01(int n) {
    //我们i从3开始,我们需要处理一下,n=0,1,2的情况
    if (n==0)
    {
        return 0;
    }
    if (n==1||n==2)
    {
        return 1;
    }


    //1.创建动态表示
    //我们要求dp[n],那么就应该有n+1个元素
    int[] dp=new int[n+1];
    //2.创建动态转移方程
    //3.初始化
    //4.填表顺序
    dp[0]=0;
    dp[1]=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]=dp[i-1]+dp[i-2]+dp[i-3]

我们只需要四个变量,就可以完成这个操作

如下图

代码详解

    //我们i从3开始,我们需要处理一下,n=0,1,2的情况
    if (n==0)
    {
        return 0;
    }
    if (n==1||n==2)
    {
        return 1;
    }
   
   //直接初始化a,b,c,d
    int a=0;
    int b=1;
    int c=1;
    int d=0;
    for (int i = 3; i <=n; i++) {
       d=a+b+c;
        //计算完d的值,将b赋值给a,c赋值给b,d赋值给c
        a=b;
        b=c;
        c=d;
    }
    return d;
}

小结

落魄谷中寒风吹

春秋蝉鸣少年归

荡魂山处石人泪

定仙游走魔向北

逆流河上万仙退

爱情不敌坚持泪

宿命天成命中败

仙尊悔而我不悔

继续学习去了!

麻烦家人们一键三连!!!(点赞,关注,收藏!!!)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手动给docusaurus添加一个搜索

新版博客用docusaurus重构已经有些日子了&#xff0c;根据docusaurus的文档上也申请了Algolia,想一劳永逸的解决博客的搜索问题。但是流水有意&#xff0c;落花无情。 algolia总是不给我回复&#xff0c;我只能对着algolia的申请页面仰天长叹。 正常情况的申请 按照docusaur…

社区论坛小圈子小程序源码系统:自定义小程序管理社区圈子软件圈子系统系统开发-做社区圈子丨圈子论坛社区交友系统开源版小程序源码丨

简述 移动互联网的快速发展&#xff0c;微信小程序作为一种新型的应用形态&#xff0c;已经深入到人们的生活中。特别是对于社区论坛类应用&#xff0c;小程序版本可以更好地满足用户快速、便捷获取信息的需求。下面给大家分享一款社区论坛小圈子小程序源码系统。 在这个信息…

跨境电商MercadoLibre(美客多)平台预约号操作流程自动化系统

目录 一、前置配置准备 1. 安装Chrome插件 2. 添加预约配置 二、开始使用 MercadoLibre&#xff08;美客多&#xff09;于2021年10月18号上线了新预约入仓系统&#xff0c;在MercadoLibre美客多平台上&#xff0c;新入仓预约系统是一项非常重要的功能&#xff0c;它可以帮助…

2024华中杯数学建模挑战赛选题建议及各题思路来啦!

大家好呀&#xff0c;华中杯数学建模开始了&#xff0c;来说一下初步的选题建议吧&#xff1a; 首先定下主基调&#xff0c; 本次华中杯推荐选择C题目。难度方面A&#xff1e;B&#xff1e;C&#xff0c;A是优化类题目&#xff0c;难度较高&#xff0c;建议参考23国赛A优秀论…

STM32G431RBT6移植FreeRTOS

引言&#xff1a; 本文专门为参加了蓝桥杯嵌入式赛道的同学准备&#xff0c; 大家可能会有这样一个问题&#xff0c; 比完赛之后&#xff0c; 对于像继续使用STM32G431RBT6学习FreeRTOS的&#xff0c; 发现网上的教程使用的板子基本上都是F1和F4的&#xff0c; 其实呢&#xff…

《八》QSplitter拆分器以及QDockWidget窗口详解

QSplitter简介 QSplitter拆分器允许用户通过拖动子部件之间的边界来控制它们的大小。 单个拆分器可以控制任意数量的小部件。QSplitter的典型用法是创建几个小部件&#xff0c;并使用insertWidget()或addWidget()添加它们。 常用方法 默认情况下&#xff0c;QSplitter会动态…

甘特图是什么?如何利用其优化项目管理流程?

甘特图是项目管理软件中十分常见的功能&#xff0c;可以说每一个项目经理都要学会使用甘特图才能更好的交付项目。什么是甘特图&#xff1f;甘特图用来做什么&#xff1f;简单来说一种将项目任务与时间关系直观表示的图表&#xff0c;直观地展示了任务进度和持续时间。 一、甘特…

【k8s】:kubectl 命令设置简写启用自动补全功能

【k8s】&#xff1a;kubectl 命令设置简写&启用自动补全功能 1、设置kubectl命令简写2、启用kubectl自动补全功能 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; Kubernetes&#xff08;K8s&#xff09;是一个强大的容器编排平台&#…

【话题】程序员如何搞副业,简单探讨下

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景前提条件打造私域广结朋友平台 技能转化为价值1. 副业途径2. 如何开展3. 未来趋势与建议4. 挑战与策略5. 规划与发展 文章推荐 背景 程序员不仅拥有将抽象概念转化…

极海APM32F003F6U7通过AEC-Q100车规级可靠性认证

行车安全是汽车行业考虑的第一要义&#xff0c;因此汽车电子MCU的可靠性尤为重要&#xff0c;极海APM32F003F6U7车规级MCU遵循AEC-Q100质量标准&#xff0c;确保汽车电子元器件在极端环境下的可靠性和稳定性&#xff0c;并顺利通过了AEC-Q100车规级可靠性认证。 关于AEC-Q100 …

Vitis HLS 学习笔记--ap_int.h / ap_fixed.h(2)-深度探究

目录 1. 前文回顾 1.1 简单背后的复杂 1.2 复杂性的来源 2. 关键代码 2.1 功能概述 2.2 关系梳理 2.3 理解构造函数二 2.4 理解HLS_CONSTEXPR 2.5 理解const volatile 3. 探究ap_int<8> c&#xff1b;经历了什么 4. 在调试中查看 1. 前文回顾 在《Vitis HLS…

基于springboot实现厨艺交流平台系统项目【项目源码+论文说明】

基于SpringBoot实现厨艺交流平台系统演示 摘要 使用旧方法对厨艺交流信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在厨艺交流信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时…

[算法] 动态规划

对这个算法的原有印象就是非常难理解&#xff0c;而且怎么都感觉这个算法名称有些误导&#xff1b;或者是要引申着看&#xff1f;因为里面的动态是怎么个动态&#xff1f; 这里的动态是指每一次的计算结果会影响下一次&#xff0c;或者再次的运算效率&#xff0c;也就是说下一次…

瀑布流组件(vue2)

文档连接&#xff1a;clz 加载状态、行数 可以自行控制&#xff0c;目前只支持vue2 实现效果&#xff1a;

华为手机无法弹出wifi上网认证页面处理

华为手机无法弹出wifi上网认证页面 连wifi后跳到上图界面卡住&#xff0c;不跳转到单位的上网认证界面。 打开手机的设置应用&#xff0c;点击上面的WLAN选项。 点击上面的更多WLAN设置选项。 关闭WLAN安全检测就可以正常弹出上网认证界面&#xff0c; 正常弹出上网认证界面&a…

【RAR技巧】rar压缩包的三种加密方法

文件压缩成rar压缩包后&#xff0c;想要保护文件内容不被他人随意解压&#xff0c;我们可以给rar压缩包设置加密&#xff0c;今天分享3种方法设置rar文件加密方法。 方法一&#xff1a;加密 最简单的加密方法&#xff0c;就是在加密文件时输入想要设置的密码&#xff0c;完成…

栈和队列-介绍与实现(超级详解-C语言)

栈 栈的介绍 栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈…

Mac中隐私安全性设置-打开任何来源

文章目录 **Mac中隐私安全性设置-打开任何来源**一、目的二、打开方式 Mac中隐私安全性设置-打开任何来源 一、目的 从外部下载的软件频繁打不开&#xff0c;需要从隐私安全性中重新选择一下&#xff1b;默认Mac隐藏了任何来源 二、打开方式 打开终端&#xff0c;输入一下命…

配置BFD

目录 原理概述 实验目的 实验内容 实验拓扑 1.基本配置 2.配置OSPF路由协议 3.配置VRRP协议 4.配置BFD 原理概述 为了减小设备故障对网络业务造成的影响&#xff0c;提高网络的可用性&#xff0c;网络设备需要能够尽快检测到与相邻设备之间的通信故障&#xff0c;以便及…

详解运算符重载——探索运算符重载的应用

前言:运算符重载是面向对象的一个重要的知识点。我们都知道内置类型可以进行一般的运算符的运算。但是如果是一个自定义类型&#xff0c; 这些运算符就无法使用了。那么为了解决这个问题&#xff0c; 我们的祖师爷就在c中添加了运算符重载的概念。 本篇主要通过实例的实现来讲述…