首页 > 其他分享 >动态规划

动态规划

时间:2025-01-18 16:11:06浏览次数:1  
标签:结果 int com 自顶向下 https 动态 规划 dp

在其他博客看到的一句话:计算机归根结底只会做一件事情——穷举;所有的算法都是如何让计算机“聪明”的穷举。

什么是动态规划

动态规划是将复杂问题分解成小问题求解的策略,与分治算法不同的是,分治算法要求各个子问题是相互独立的,而动态规划各个子问题是相互关联的。

自顶向下

递归是常见的自顶向下的问题。使用斐波那契数进行举例:要求f(10)的结果,需要知道f(9)的结果,之后类推直到需要知道f(1)和f(2)的值,最后逐步返回最终得到结果。这种从结果找到初始值的思路就叫做自顶向下

 ```

int Fib(int n) {     //初始值f(0)=1,f(1)=1     if(n==1||n==2)     return 1;
    return Fib(n-1)+Fib(n-2);
}

```

自底向上

动态规划是一种自底向上的问题。同样是斐波那契数问题:还是要求f(10)的结果,这次从f(1)和f(2)开始向上求值,直到得到f(10)结果,最后返回结果。这种从初始条件推到结果得思路就为自顶向下

```

int Fibi(int n) {     std::vector<int> dp(n,0);     int i=0;     dp[0]=1;     dp[1]=1;     for(i=2;i<n;i++)     {         dp[i]=dp[i-1]+dp[i-2];     }     return dp[n-1]; }

```

自己认为这两种方式往往同时考虑,得出结果,最后根据实际情况选择具体得实现方式。

状态转移方程

状态转移方程其实就是解决问题的核心,上面的dp[i]=dp[i-1]+dp[i-2]就是状态转移方程。

动态规划示例问题

爬楼梯题目 :

https://leetcode.com/problems/climbing-stairs/

有N级楼梯,一次可以爬1级或2级,问有几种爬法到顶。

解题思路:设定楼梯级数推理,得到结果类似斐波那契数列。

```

int climbStairs(int n) {     std::vector<int> dp(n,0);     int i=0;     dp[0]=1;     dp[1]=2;     for(i=2;i<n;i++)     {         dp[i]=dp[i-1]+dp[i-2];     }     return dp[n-1]; }

```

问题优化(滚动数组)

根据对上述算法的分析,发现并不需要列举每个数组,只需要对三个状态数据保存即可。使用滚动数组的思想进行优化:

```

int Fibi(int n) {     int dp;     int i=0,     pre1=1,     pre2=2;     for(i=2;i<n;i++)     {         dp=pre2+pre1;         pre1=pre2;         pre2=dp;     }     return dp; }

```

滚动数组简单的理解就是让数组滚动起来,每次使用固定的几个空间存储,来达到压缩、节省存储空间的作用。

 

写到最后

最后插一句,斐波那契数列其实可以直接使用公式得出结果。

还有这次的博客参考文章较少,很多有主观思想的存在,希望大佬即时指出问题,非常感谢。

 


 

参考文章:

https://houbb.github.io/2020/01/23/data-struct-learn-07-base-dp#dynamic-programming

https://mp.weixin.qq.com/s?__biz=MzI2OTE0ODY5Mw==&mid=2247525996&idx=1&sn=3d76f5fc2feb0559b4c92949799975fa&chksm=ebd22c9d8f67e1092763fb3e582a7141482e85220e61e5a359775545e902954f3228873b3b53&scene=27

https://blog.csdn.net/qq_41655898/article/details/120174686

https://baike.baidu.com/item/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97/99145

https://www.cnblogs.com/overxus/p/18167834

 

标签:结果,int,com,自顶向下,https,动态,规划,dp
From: https://www.cnblogs.com/LJianYu/p/18678484

相关文章

  • 使用Axios实现表格数据动态加载与转换
    在现代的Web开发中,前后端分离架构越来越普遍。前端页面通过Ajax请求从后端获取数据并进行展示是一种常见的需求。本文将通过一个简单的示例,介绍如何使用Vue.js结合ElementUI以及Axios库,实现表格数据的动态加载与转换。一、项目背景在开发一个会员管理系统时,我们需要在前端页......
  • 1. 数码管的静态动态控制
    数码管,我的超级LED![[Pastedimage20250116130225.png]]![[Pastedimage20250116134916.png]]![[Pastedimage20250116130421.png]]多个数码管共引脚连接节省接口在同一个时刻相同引脚的数码管只能显示相同内容动态数码管显示是根据人眼视觉残留与数码管余辉实现的图中C......
  • 全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
    系列文章目录01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南02-玩转LangChainMemory模块:四种记忆类型详解及应用场景全覆盖03-全面掌握LangChain:从核心链条构建到动态任务分配的实战指南文章目录系列文章目录前言一、LangChain的核心链简介1.1......
  • 动态排名
    考虑一下正确性:在递归树上任意一点,任意一个查询操作,所有对其的影响一定会计入到树状数组中。分情况讨论。对于最开始的初始化操作,所有在\([L,R]\)的操作肯定都在当前操作序列的最前面。对于后面的修改操作,如果是\(-1\)标记,那么其对应的添加操作一定也在当前操作序列里面,而且在这个......
  • 【c++】【算法】【动态规划】最长公共子序列
    【c++】【算法】【动态规划】最长公共子序列//递归方式//最长公共子序//直接递归求最长公共子序长度intFindValue(conststring&X,conststring&Y,inti,intj){ if(i==0||j==0)return0; if(X[i]==Y[j])returnFindValue(X,Y,i-1,j-1)+1; ......
  • 【一看就会】Autoware.universe的“规划”部分源码梳理【一】
    文章目录前言一、planning实现的几个功能1.规划起点到目标点的路线2.规划跟随路线的轨迹3.确保车辆不与障碍物发生碰撞4.确保车辆遵守交通规则5.规划车辆可行的轨迹二、全局路径生成模块——mission_planner1.mission_planner.cpp1.输入输出:2.代码流程:3.源码注释2.rout......
  • 数字工厂规划蓝图报告(69页 参考学习 PPT)
            该报告为数字化工厂规划蓝图的整体进展情况概述,对该内容的简洁总结:        详细记录了项目在各个阶段的准备工作和核心任务。在项目准备阶段(编号0),主要完成了以下工作:-0.1项目工作方法制定:确立了项目执行的基本方法和流程。-0.2项目工作计划制......
  • uniapp仿微信动态功能实现思路供参考
    1,创建三个数据表,一个朋友圈动态表,一个点赞表,一个评论表动态表创建 例如:dtlist包括用户uid,内容about,文字是否base64格式iszy,动态图片allimg,发布时间addtime(根据自己项目需要创建合适的字段)点赞表创建 例如:dzlist包括用户uid,点赞动态id:dtid,点赞时间addtime(根......
  • 2025年入职/转行网络安全,该如何规划?_网络安全职业规划
     前言前段时间,知名机构麦可思研究院发布了 《2022年中国本科生就业报告》,其中详细列出近五年的本科绿牌专业,其中,信息安全位列第一。网络安全前景对于网络安全的发展与就业前景,想必无需我多言,作为当下应届生收入较高的专......
  • 2025/1/13 笔记 动态路由
    一.动态路由1.动态路由的优势可以基于拓扑的变化而进行实时更新2.动态路由的缺点①占用额外的链路资源②安全风险③选路错误的风险 3.动态路由的分类(1)基于AS进行的分类AS:自治系统标准编号:0-65535【1-64511公有区域64512-65535私有区域】 AS之内运行的IGP路由协......