53_最长子续和(动态规划法)

一、基本概念

每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以这样的多阶段最优化决策(决策的全过程可以根据时间或空间划分为若干个联系的阶段,每个阶段又有很多选择,并且这个选择会影响到下一个阶段的选择,从而影响整个过程的活动)解决这个问题的过程就称为动态规划。

二、基本思想与策略

将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了实用的信息。

与分治法最大的区别是:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。

三、适用场景

最优化原理:假设问题的最优解所包括的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。

无后效性:即某阶段状态一旦确定。就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响曾经的状态。仅仅与当前状态有关;

有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到(该性质并非动态规划适用的必要条件可是假设没有这条性质。动态规划算法同其它算法相比就不具备优势)。

四、求解步骤

1)划分阶段:依照问题的时间或空间特征。把问题分为若干个阶段。划分后的阶段一定要是有序的或者是可排序的。

2)确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。状态的选择要满足无后效性。

3)确定决策并写出状态转移方程:依据相邻两个阶段的状态之间的关系来确定决策方法和状态转移方程。

4)寻找边界条件:一个递推的终止条件或边界条件。

阶段、状态和状态转移决策最为重要。

五、动态规划-最长子续和

1.题目分析

在53题中我们可以将每前1、2、3、...个数划分为一个阶段,每个阶段的和为所处阶段的状态,而状态转移策略即为max(max(i-1)+nums[i], nums[i])。

2.代码编写

/**
 * @param {number[]} nums
 * @return {number}
 */

var maxSubArray = function (nums) {
           let pre = 0, maxAns = nums[0];
           nums.forEach( (x) => {
                 pre = Math.max(pre + x, x);//max(max(i-1)+nums[i], nums[i])
                 maxAns = Math.max(maxAns, pre);//将现在状态的最大值与前面状态的最大值进行比较
           }) 
           return maxAns;    
}                    

 

posted @ 2021-09-13 21:00  jailbreakaaaa  阅读(106)  评论(0)    收藏  举报