题目
题目来源:三角形最小路径和 - 力扣
分析
看到这个问题的第一反应可能会有以下想法:只要每一步,都加最小值,就能得到最优解。
上述思路即贪心算法的核心思路:局部最优。
对于示例来说看起来是正确的,然而如果三角形长这样呢?
此时再用贪心算法的思路得到的解就不再是全局最优解了,这也证明了一点:每一次的局部最优走到最后并不一定是全局最优。
对于这种寻找全局最优解的思路通常是动态规划(DP),而这种思路的特点是自下而上,以示例中的三角形为例(这里将三角形倒过来,方便说明):
这里我们可以先计算出前两行的最优解:
6 + min(4, 1) = 75 + min(1, 8) = 67 + min(8, 3) = 10
此后可以得到下一步的结果:
依次类推,可以得到最后的结果是 11。
那么按照上述思路就能得到最终结果了:
const minimumTotal = (triangle) =>
triangle.reduceRight((pre, cur) =>
cur.map((n, i) => n + Math.min(pre[i], pre[i + 1]))
)[0];
💡:顺带一提,这道题灵感来自欧拉计划的 18 题。