系列文章
- [ CodeWar ] - 001:过滤重复字符
- [ CodeWar ] - 002:最大和最小值
- [ CodeWar ] - 003:判断质数
- [ CodeWar ] - 004:处理数组元素
- [ CodeWar ] - 005:用户分组
- [ CodeWar ] - 006:数组比对
- [ CodeWar ] - 007:找不同
- [ CodeWar ] - 008:分割字符串
- [ CodeWar ] - 009:哈希标签生成器
- [ CodeWar ] - 010:大数相加
- [ CodeWar ] - 011:最短路径
题目

这道题灵感来自欧拉计划的 18 题,逼格满满,我们先来理一下题意:
- 传入的值是一个金字塔型的数组
- 要找到一条路径,这个路径需要满足以下条件
- 这条路径只能从相邻的数中选择:比如上图中第三行的
3, 它能选择的数字只有5, 9, 3 - 这条路径上各个数字相加之和为所有路径中的最大值
- 这条路径只能从相邻的数中选择:比如上图中第三行的
要同时满足这两个条件还是挺麻烦的,并且在最后的需求中也提到了:
My tests include some extraordinarily high pyramids so as you can guess, brute-force method is a bad idea unless you have a few centuries to waste. You must come up with something more clever than that.
意思是暴力枚举的方法肯定过不了单测。
那么元芳,你怎么看呢?
解析
显然,对于这种类似走迷宫的问题,从终点往出发点走是一条比较常规的思路。
以题目中的小金字塔为例,我们将金字塔颠倒过来看看:

我们将注意力放在前两行,显然:
2 + max(8, 5) = 104 + max(5, 9) = 136 + max(9, 3) = 15
我们可以将其改写为:

以此类推,我们可以得到最后的三角形:

到了这里,相信逻辑以及比较清晰了:
const longestSlideDown = (pyramid) =>
pyramid.reduceRight((pre, cur) =>
cur.map((n, i) => n + Math.max(pre[i], pre[i + 1]))
)[0];