👉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数组中找最值就可以了。