给你一个 互不相同 的整数数组,其中
locations[i]
表示第i
个城市的位置。同时给你start
,finish
和fuel
分别表示出发城市、目的地城市和你初始拥有的汽油总量每一步中,如果你在城市
i
,你可以选择任意一个城市j
,满足j != i
且0 <= j < locations.length
,并移动到城市j
。从城市i
移动到j
消耗的汽油量为|locations[i] - locations[j]|
,|x|
表示x
的绝对值。请注意,
fuel
任何时刻都 不能 为负,且你 可以 经过任意城市超过一次(包括start
和finish
)。请你返回从
start
到finish
所有可能路径的数目。由于答案可能很大, 请将它对
10^9 + 7
取余后返回。示例 1:
输入:locations = [2,3,6,8,4], start = 1, finish = 3, fuel = 5 输出:4 解释:以下为所有可能路径,每一条都用了 5 单位的汽油: 1 -> 3 1 -> 2 -> 3 1 -> 4 -> 3 1 -> 4 -> 2 -> 3示例 2:
输入:locations = [4,3,1], start = 1, finish = 0, fuel = 6 输出:5 解释:以下为所有可能的路径: 1 -> 0,使用汽油量为 fuel = 1 1 -> 2 -> 0,使用汽油量为 fuel = 5 1 -> 2 -> 1 -> 0,使用汽油量为 fuel = 5 1 -> 0 -> 1 -> 0,使用汽油量为 fuel = 3 1 -> 0 -> 1 -> 0 -> 1 -> 0,使用汽油量为 fuel = 5示例 3:
输入:locations = [5,2,1], start = 0, finish = 2, fuel = 3 输出:0 解释:没有办法只用 3 单位的汽油从 0 到达 2 。因为最短路径需要 4 单位的汽油。提示:
2 <= locations.length <= 100
1 <= locations[i] <= 109
- 所有
locations
中的整数 互不相同 。0 <= start, finish < locations.length
1 <= fuel <= 200
/** * @param {number[]} locations * @param {number} start * @param {number} finish * @param {number} fuel * @return {number} */ var countRoutes = function (locations, start, finish, fuel) { const MOD = 1000000007; if (Math.abs(locations[start] - locations[finish] > fuel)) return 0; let dp = new Array(fuel + 1).fill(0).map(() => new Array(locations.length).fill(0)); dp[0][start] = 1; for (let i = 1; i <= fuel; ++i) { for (let j = 0; j < locations.length; ++j) { if (i > fuel - Math.abs(locations[finish] - locations[j])) continue; for (let k = 0; k < locations.length; ++k) { if (j == k) { if (k == start) dp[i][j]++; continue; } let d = Math.abs(locations[j] - locations[k]); dp[i][j] = (dp[i][j] + (i >= d ? dp[i - d][k] : 0)) % MOD; } } } return dp[fuel][finish]; };
05-12
844
09-19
2万+
10-14
1163
03-09
9378
09-27
439
09-24
923
09-06