大数据最新【数据结构与算法】之动态规划经典问题_动态规划问题

👉Java微服务开源项目可参考:企业级Java微服务开源项目(开源框架,用于学习、毕设、公司项目、私活等,减少开发工作,让您只关注业务!)


目录

文章标题

在这里插入图片描述
动态规划(Dynamic Programming)相关问题的一般形式是求最值,比如最长递增子序列等,动态规划的核心问题是【穷举】。因为在求最值的过程中,我们需要求出一系列可行的值,再从可行值之中选择出目标答案。

动态规划的 【穷举】 中,会产生很多很多重复计算,所以,我们可能需要一个“备忘录”保存重复计算的结果,同时,我们需要一个DP table来优化穷举的过程,记录子问题的结果,相关内容在递归算法篇章的斐波那契数列中见到过。

动态规划的三要素如下:

  • (1)重叠子问题,子问题的就算方式大致相同。
  • (2)复合最优子结构,问题的最优解包含子问题的最优解。反过来说就是,我们可以通过子问题的最优解,推导出问题的最优解。
  • (3)状态转移方程,怎么从子问题最优解推倒当前问题的最优解。

下面我们对经典的动态规划问题进行介绍~

一、最长递增子序列

题目: 给定一个无序的序列,求解它的【最长递增子序列】的长度。方法签名:int lengthOfLIS(int[] nums)

注意:【子序列】和【子串】是不一样的,【子序列】是可以不连续的,但是子串必须是连续的。

举例: nums[] = {3,·1,4,1,5,9,2,6,5} 的最长递增子序列长度为4,结果返回4即可,此时的为子序列:1,4,5,9。

在使用【动态规划】方案解决该问题的时候,我们需要首先思考的是,怎么去设计一个dp数组,用来存放各个子问题的结果。

在这道题中,我们想:

  • (1)【宏观问题】是这个数组中存在的【最长子序列】。
  • (2)将其拆分成【子问题】就是,枚举出【从零到每一个位置】的最长递增序列,这也是我们所需要定义的一个dp数组。
  • (3)dp数组保存了所有的计算结果,最后在dp数组中找最值就可以了。
  • 27
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值