动态规划-初步理解

本篇主要是对引用文的理解、记录,对动态规划有一个初步的理解。
【动态规划-初步理解】动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。
解决问题的前提是做好逻辑规划,白描出思路,然后再讲思路转换为代码实现,进而对代码进行优化,使用现成的已有的语法更快速高效的解决问题。
引用文先讲解了解决动态规划问题的思路,后举例说明,跟学了前三个例子。

动态规划,无非就是利用历史记录,来避免我们的重复计算。而这些历史记录,我们得需要一些变量来保存,一般是用一维数组或者二维数组来保存。
第一步骤:定义数组元素的含义;
第二步骤:找出数组元素之间的关系式;
第三步骤:找出初始值;
理解与解读:
第一步骤,将问题拆解为一系列的子问题,并明确子问题的含义,逐一求解子问题,进而得解。
第二步骤,理解子问题之间的相互关系,并将这种关系转换为一个公式;
第三步骤,子问题公式推导到不能推导的最后,必然有能够直接获取的值,这就是初始值,在进行推导之前要给定给出初始值,整个推导过程最后才能有解。
引用文中的前三个例子已练习,下面给出自己的例子(虽然也参考了官方题解):
/** * 53. 最大子数组和 * 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 * 子数组 是数组中的一个连续部分。 * 示例 1: * 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] * 输出:6 * 解释:连续子数组[4,-1,2,1] 的和最大,为6 。 * 来源:力扣(LeetCode) * 链接:... * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 */ public class MaximumSubarray {public static int maxSubArray1(int[] nums) { //1、定义一个数组dp:dp[i]为以第i个元素为结尾的连续子数组的最大和, 最后求出dp中max值即为结果值 int[] dp = new int[nums.length]; //2、元素间的关系:dp[i] = max(dp[i-1]+nums[i], nums[i]) //3、找出初始值 int maxSubArrayCount = nums[0]; dp[0] = nums[0]; for(int i=1; i

引用
告别动态规划,连刷 40 道题,我总结了这些套路,看不懂你打我(万字长文)https://juejin.cn/post/684490...
动态规划百度百科 https://baike.baidu.com/item/...

    推荐阅读