卡车行驶1单位距离时燃烧1单位燃料。卡车必须到达沿道路 L 个距离单位的城镇,并且在起点,卡车的油箱中有 P 个燃料单位(两个值)是(L,P)对)。油箱是无限的,因此卡车始终可以存储更多的燃油。沿道路的可能加油站数量以整数对(a,b)给出,其中 a 是小镇与加油站之间的距离。 strong>,而 b 是此加油站可以提供的加油单位数。
目标是在前往城镇的途中尽量减少停留。该算法必须返回进行行程所需的最少停留次数。
我想出了如何使用优先级队列使用贪婪算法解决此问题的方法,但我一直在努力寻找解决问题的动态方法。我知道那里有一个,但我无法弄清楚。我将不胜感激。
答案 0 :(得分:1)
从https://leetcode.com/problems/minimum-number-of-refueling-stops/solution/复制的想法,
让我们确定dp [i],这是我们使用i加油站可到达的最远位置。这是因为我们想要dp [i]> =目标的最小i。
算法
让我们更新dp,因为我们按顺序考虑每个电台。没有站,显然我们可以获得零加油站的startFuel最大距离。
现在让我们看一下更新步骤。当添加一个加油站[i] =(位置,容量)时,只要我们可以在t加油站停靠的情况下到达该站,那么现在我们就可以在t + 1加油站停靠的情况下达到更大的容量。
例如,如果我们可以通过1个加油站到达15公里的距离,现在我们在10号位置加了30升燃油,那么我们可以在2个加油站到达45公里的距离。
>public int minRefuelStops(int target, int startFuel, int[][] stations) {
int N = stations.length;
long[] dp = new long[N + 1];
dp[0] = startFuel;
for (int i = 0; i < N; ++i)
for (int t = i; t >= 0; --t)
if (dp[t] >= stations[i][0])
dp[t+1] = Math.max(dp[t+1], dp[t] + (long) stations[i][1]);
for (int i = 0; i <= N; ++i)
if (dp[i] >= target) return i;
return -1;
}
复杂度分析
时间复杂度: O(N ^ 2),其中N是站点的长度。
空间复杂度: O(N),dp使用的空间。