当前位置: 首页 > ds >正文

动态规划引入

概念:

动态规划将一个复杂的问题分解为一系列相互关联的子问题,通过求解这些子问题,并利用子问题的解来构造原问题的解。它通常使用一个表格或数组来存储子问题的解,这样可以避免在求解过程中对同一个子问题进行多次重复计算,从而提高算法的效率。

解题步骤:

一.解析题目

二.算法原理:1.状态表示2.状态转移方程3.初始化4.填表顺序5.返回值

三.编写代码

四.空间优化

 动态规划简单来说就是创建一个一维数组或者二维数组,里面存的每一个值都表示一种状态

这些状态怎么来的:1.根据题目  2.经验+题目要求   3.分析题目的过程中发现重复的子问题,把子问题抽象成一种状态

 以一道入门级动态规划题目进行讲解leetcode1137

一。解析题目:读题,看题目要求 

二。算法分析第一步状态表示:创建一个一维数组dp,dp[i]表示:第i个泰波纳契数 

算法分析第二步状态转移方程:由题目可得dp[i]=dp[i-1]+dp[i-2]+dp[i-3];(也就是求dp[i]=什么)

算法分析第三步初始化:保证填表得时候不越界,也就是这里得第0/1/2个需要你手动初始化

                                       有状态转移方程是得不到0/1/2的

算法分析第四步填表顺序:为了填写当前状态,所需要的状态已经计算过了,例如你在求第四个位置时,1/2/3的位置已经计算出来了,而不是跳过计算第3个位置,去算第4个然后填第四个,所以你填表的顺序是从左到右

算法分析第五步返回值:返回值要根据题目要求+你的状态表示,题目要求返回第n个泰波纳契数,你的状态表示为dp[i]:i表示第i个泰波纳契数,所以直接但会dp[i]即可

三。编写代码:

四。空间优化

1.滚动数组:可以观察当我们在解决第i个状态时,只要用到前若干个,也就是这里我们填第4个状态时,只要1/2/3,填第5个是只要2/3/4,所以我们可以不用管其他状态的值

这样空间复杂度就变为O(1);

 

注意这里的赋值操作:从前往后赋值和从后往前赋值不同,从后往前在这里是错误的 ,也就是你不能c=d,b=c,a=b;

总结

动态规划的题目大致解决方法都可以按照如上的思路进行

http://www.xdnf.cn/news/3482.html

相关文章:

  • [UVM]寄存器模型的镜像值和期望值定义是什么?他们会保持一致吗?
  • 【Linux】线程池和线程补充内容
  • LeetCode —— 94. 二叉树的中序遍历
  • 基于若依RuoYi-Vue3-FastAPI 的 Docker 部署记录
  • 生物化学笔记:神经生物学概论06 听觉系统 结构与功能 声强范围的检测(外毛细胞动态调节)
  • 猜数字游戏:从数学原理到交互体验的完整设计指南
  • 边缘计算革命:大模型轻量化部署全栈实战指南
  • CANopen协议简单介绍和使用
  • 基于静态局部立方体贴图的高效软阴影
  • 先知AIGC超级工场,如何助力企业降本增效?
  • 上位机 日志根据类型显示成不同颜色
  • VS乱码问题
  • 2025年Jetpack Compose集成网络请求库的完整实施方案
  • Dify LLM节点的记忆功能深度探究
  • 滚珠丝杆怎么选型?
  • 《解锁LibTorch:开启C++深度学习新征程》
  • Windows 系统中安装 flash - attn
  • 智慧校园综合整体解决方案-8PPT(58页)
  • AI 知识库:企业知识管理的利器
  • 【C++】频繁进行动态内存分配和释放可能导致多方面的问题
  • 深入探讨互联网大厂Java核心技术与架构设计
  • windbg调试dump文件
  • 信号与系统-风中醉风
  • 2025 RSAC|自主式 GenAI 安全智能体(Agent)开启防御新纪元
  • Splunk 使用Role 实现数据隔离
  • firecrawl的docker安装和api调用
  • Linux安装MySQL详细教程
  • 视觉标记token:解锁AI视觉理解新维度的钥匙
  • 强化学习之基于无模型的算法之基于值函数的深度强化学习算法
  • DeepSeek-V3 解析第二篇:DeepSeekMoE