动态规划: 它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。
因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。 当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线。
题目: 在数组中可以任意取出不能相邻的数,求怎么取得到最大值并返回。
例子:
[100, 4, 1,99,-100,1000,33,2,1,5,88]
// 1289
解: 假设 把数组分成若干份去执行结果
-
第一阶段:当数组长度只有1的时候,它就是最优解。因此直接取出第一个数
sum[0] = arr[0]
-
第二阶:数组长度为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]
}