卡车在道路和加油站问题的动态规划算法

时间:2019-09-20 11:50:27

标签: algorithm dynamic-programming

卡车行驶1单位距离时燃烧1单位燃料。卡车必须到达沿道路 L 个距离单位的城镇,并且在起点,卡车的油箱中有 P 个燃料单位(两个值)是(L,P)对)。油箱是无限的,因此卡车始终可以存储更多的燃油。沿道路的可能加油站数量以整数对(a,b)给出,其中 a 是小镇与加油站之间的距离。 strong>,而 b 是此加油站可以提供的加油单位数。

目标是在前往城镇的途中尽量减少停留。该算法必须返回进行行程所需的最少停留次数。

我想出了如何使用优先级队列使用贪婪算法解决此问题的方法,但我一直在努力寻找解决问题的动态方法。我知道那里有一个,但我无法弄清楚。我将不胜感激。

1 个答案:

答案 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使用的空间。