动态规划:取最大解

60 阅读2分钟

动态规划:它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。

因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线。

题目:在数组中可以任意取出不能相邻的数,求怎么取得到最大值并返回。

例子:

js复制代码[100, 4, 1,99,-100,1000,33,2,1,5,88] // 1289

解:假设 把数组分成若干份去执行结果

  1. 第一阶段:当数组长度只有1的时候,它就是最优解。因此直接取出第一个数

sum[0] = arr[0]

  1. 第二阶:数组长度为2,并对比第二个数和第一个数谁大,把大的结果存到第二阶段的结果里面

sum[1] = Math.max(arr[0], arr[1])

接下来执行后面的阶段,并每次把执行的结果存到每个阶段的执行结果中去。

当 i=2 即数组长度为三的时候,取最后一个值,那么 sum[1] i-1 是上个数的执行结果,

sum[0] i-2 是第一次选择的结果与第 i=2 次间隔为1.

那么这次的执行结果和上次的执行结果比较取最大值:

即比较 sum[0]+当前值 与 sum[1]也就 max(arr[2] + sum[2-2],sum[2-1]).

当 i=3 时 当前要抉择的是 99 + ? 与 3-1 sum[2] 即前一次的对比,取最大值 这里的 ? 明显就是 sum[1] 即第二阶段数组长度为 2 的值 为 100 max(100,4)

取出为 100也就是 max(99 + sum[3-2],sum[3-1])

从上推导出 max(arr[i]+sum[i-2],sum[i-1]) 是一个动态规划链。

因此 for 循环整数组,并取出最终的结果及 sum[leng -1]

function getSum(arr) { 
    const sum = [] 
    sum[0] = arr[0] 
    sum[1] = Math.max(arr[0], arr[1]) 
    for (let i = 2; i < arr.length; i += 1) { 
        sum[i] = Math.max(arr[i] + sum[i - 2], sum[i - 1]) 
    } 
    return sum[arr.length - 1] 
}