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

动态规划引入

概念:

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

解题步骤:

一.解析题目

二.算法原理: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;

总结

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

相关文章:

  • 【Dify系列教程重置精品版】第五章:Dify配置Ollama
  • C# System.Text.Json终极指南(十):从基础到高性能序列化实战
  • MCP 多工具协作链路设计:打造真正的智能工作流
  • 补题:K - Magic Tree (Gym - 105231K)
  • SpringBoot研究生双选系统开发实现
  • Rust中避免过度使用锁导致性能问题的策略
  • C# | 基于C#实现的BDS NMEA-0183数据解析上位机
  • 详解TypeScript中的类型断言及其绕过类型检查机制
  • Python 从入门到精通3 控制结构
  • 深度学习基础--目标检测入门简介
  • 软件工程国考
  • 使用Python和Pandas实现的Azure Synapse Dedicated SQL pool权限检查与SQL生成用于IT审计
  • PyTorch 与 TensorFlow:深度学习框架的深度剖析与实战对比
  • 等保系列(一):网络安全等级保护介绍
  • 第四章 Maven
  • 世纪华通:从财报数据看其在游戏领域的成功与未来
  • 3D版同步帧游戏
  • PyTorch中“原地”赋值的思考
  • GPU虚拟化实现(六)
  • 线段树原理和代码详解
  • 美国防部监察机构扩大“群聊门”事件调查范围
  • 魔都眼|石库门里看车展,五一来张园体验城市“漫时光”
  • 《探秘海昏侯国》数字沉浸特展亮相首届江西文化旅游产业博览交易会
  • 解放日报:服务国家战略,加快建成科技创新高地
  • 网警查处编造传播“登顶泰山最高可得3万奖金”网络谣言者
  • 空调+零食助顶级赛马备战,上海环球马术冠军赛将焕新登场