动态规划:取最大解

124 阅读2分钟

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

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

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

例子:

[100, 4, 1,99,-100,1000,33,2,1,5,88]
// 1289

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

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

  2. 第二阶:数组长度为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]).

  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]
    }