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

news2024/11/16 16:36:03

题外话

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

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

前面那篇

千锤百炼之每日算法(一)-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;
}

小结

落魄谷中寒风吹

春秋蝉鸣少年归

荡魂山处石人泪

定仙游走魔向北

逆流河上万仙退

爱情不敌坚持泪

宿命天成命中败

仙尊悔而我不悔

继续学习去了!

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

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

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

相关文章

数据结构之排序了如指掌(二)

目录 题外话 正题 选择排序 选择排序思路 选择排序代码详解 选择排序复杂度 双向选择排序 双向选择排序思路 双向选择排序代码详解 堆排序 堆排序思路 堆排序代码详解 堆排序复杂度 冒泡排序 冒泡排序思路 冒泡排序代码详解 冒泡排序复杂度 小结 题外话 今天…

2024年第十六届“华中杯”(A题)大学生数学建模挑战赛| 物理建模,多目标优化| 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看华中杯 (A题&#xff09;&#xff01; CS团队倾…

最简单的例子说清楚量化对冲----量化中性策略 vs DMA策略

一个简单的例子 何为中性对冲&#xff0c;比如股票市场上有一个指数叫做中国指数&#xff0c;由十支股票组成。现在每一只股票买一万块&#xff0c;共十万。这样子我们是不是相当于等权的买了整个指数所包含的全部股票。现在出现一个东西叫做股指期货&#xff0c;股指期货的作…

Redis: 集群

文章目录 一、单点Redis的问题二、主从架构1、概述2、集群结构3、主从数据同步原理&#xff08;1&#xff09;全量同步&#xff08;2&#xff09;增量同步 4、总结&#xff08;1&#xff09;全量同步和增量同步的区别&#xff08;2&#xff09;什么时候执行全量同步&#xff08…

基础拓扑学习

基础拓扑 有限集、可数集和不可数集 2.1 定义 考虑两个集 A A A和 B B B&#xff0c;他们的元素可以是任何东西。假定对于 A A A的每个元素 x x x&#xff0c;按照某种方式&#xff0c;与集 B B B的一个元素联系着&#xff0c;这个元素记作 f ( x ) f\left( x \right) f(x);那…

Django框架设计原理

相信大多数的Web开发者对于MVC&#xff08;Model、View、Controller&#xff09;设计模式都不陌生&#xff0c;该设计模式已经成为Web框架中一种事实上的标准了&#xff0c;Django框架自然也是一个遵循MVC设计模式的框架。不过从严格意义上讲&#xff0c;Django框架采用了一种更…

Syncthing实时共享同步数据,可用于异地备份数据

一、Syncthing概述 Syncthing的主要功能是用来进行文件传输&#xff0c;我需要对多台不同系统的&#xff08;windows&#xff0c;linux&#xff09;服务器的数据进行备份&#xff0c;当前测试使用Syncthing来进行两台Centos7服务器数据备份&#xff0c;注意在不同服务器使用Syn…

手写商城项目学习/复习到的知识

1.在windowr创建项目可以选择自定义/vue2/vue3,但尝试在vscode不能选择. 2.vant vant是组件库,可导入结构等.vant2用于vue2,vant3,vant\4用于vue3 vant2的使用 官网: Vant 2 - 轻量、可靠的移动端组件库 (gitee.io) 全部导入:将vant所有的组件放到了所有组件内component使…

web自动化测试系列-selenium常用方法定位(五)

目录 1.selenium的定位方法 2.操作案例 3.实现代码 前面我们介绍了html页面元素主要是通过标签和属性来进行定位 &#xff0c;只要满足唯一&#xff0c;无论是标签还是属性 &#xff0c;都能进行定位 。当然 &#xff0c;我们要通过selenium来进行定位 &#xff0c;同样还是…

Python:可迭代对象与迭代器

相关阅读 Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 根据Python官方文档&#xff0c;可迭代对象(iterable)是“一种能够逐个返回其成员项的对象”。具体来说&#xff0c;这种对象要么定义了一个返回迭代器(iterator)的魔术…

深入解析Nacos配置中心的动态配置更新技术

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在微服务架构中&#xff0c;配置管理变得尤为关键。Nacos&#xff0c;作为一个开源的、易于使用的、功能丰富的平台&#xff0c;为…

python 无处不在的二分搜索

我们知道二分查找算法。二分查找是最容易正确的算法。我提出了一些我在二分搜索中收集的有趣问题。有一些关于二分搜索的请求。我请求您遵守准则&#xff1a;“我真诚地尝试解决问题并确保不存在极端情况”。阅读完每个问题后&#xff0c;最小化浏览器并尝试解决它。 …

从计算机视觉到生命科学

人工智能技术的快速发展正在深刻影响和重塑我们的生活。作为AI领域的前沿方向,多模态大模型凭借其强大的跨域学习和推理能力,在众多行业和科学领域展现出广阔的应用前景。多模态AI指的是能够同时处理和整合文本、图像、音频、视频等不同模态数据的智能系统。这种融合不同信息源…

Java详解:GUI容器组件 | 功能组件

✎ 简介&#xff1a; Graphical User Interface&#xff08;GUI&#xff09;图形用户界面 图形界面对于用户来说在视觉上更易于接受. ✎ 关于swing: • swing是一个为java设计的GUI工具包javax.swing&#xff0c;包括了用户界面的各种组件. • swing中组件可以分为两大类&…

刷题之Leetcode19题(超级详细)

19.删除链表的倒数第N个节点 力扣题目链接(opens new window)https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 进阶&#xff1a;你能尝试使用一趟扫描实现吗&#x…

【C语言__函数栈帧的创建和销毁__复习篇9】

目录 前言 一、知识补充 二、分析创建和销毁的过程 三、前言问题回答 前言 本篇主要讨论以下问题&#xff1a; 1. 编译器什么时候为局部变量分配的空间 2. 为什么局部变量的值是随机的 3. 函数是怎么传参的&#xff0c;传参的顺序是怎样的 4. 形参和实参是什么关系 5. 函数…

Jmeter 性能压测-常见问题

1、怎么确定系统最大负载&#xff1f; 通过负载测试&#xff0c;不断增加用户数&#xff0c;随着用户数的增加&#xff0c;各项性能指标也会相应产生变化&#xff0c;当出现了性能拐点。 比如&#xff0c;当用户数达到某个数量级时&#xff0c;响应时间突然增长&#xff0c;那…

算法:期望场景;鲁棒优化

部分代码 for i1:T stst[D_DGk(i)*min_P_DG<P_DGk(i)<D_DGk(i)*max_P_DG]; end for i2:T indicatorD_DGk(i)-D_DGk(i-1); rangei:min(T,iT_up-1); st st[D_DGk(range)>indicator]; end for i2:T indicatorD_DGk(i-1)-D_DGk(i); rangei:min(T…

《QT实用小工具·二十九》托盘图标控件

1、概述 源码放在文章末尾 托盘图标控件 可设置托盘图标对应所属主窗体。 可设置托盘图标。 可设置提示信息。 自带右键菜单。 下面是demo演示&#xff1a; 项目部分代码如下&#xff1a; #ifndef TRAYICON_H #define TRAYICON_H/*** 托盘图标控件* 1. 可设置托盘图标…

书生·浦语大模型全链路开源体系-第5课

书生浦语大模型全链路开源体系-第5课 书生浦语大模型全链路开源体系-第5课相关资源LMDeploy基础配置LMDeploy运行环境下载internlm2-chat-1_8b模型使用Transformer来直接运行InternLM2-Chat-1.8B模型使用LMDeploy以命令行方式与InternLM2-Chat-1.8B模型对话设置KV Cache最大占用…