Leetcode: 871. Minimum Number of Refueling Stops

Problem Statement

from typing import List


class Solution:
    def minRefuelStops(
        self, target: int, startFuel: int, stations: List[List[int]]
    ) -> int:
        if target <= startFuel:
            return 0
        N = len(stations)
        m = [[float("inf")] * N for _ in range(N)]
        b = [[float("inf")] * N for _ in range(N)]
        for k in range(N):
            for i in range(N - 1, -1, -1):
                if k == 0:
                    m[k][i] = max(0, target - stations[i][0] - stations[i][1])
                    b[k][i] = min(
                        b[k][i + 1] if i + 1 < N else float("inf"),
                        m[k][i] + stations[i][0],
                    )
                elif i + 1 == N:
                    b[k][i] = float("inf")
                else:
                    m[k][i] = b[k - 1][i + 1]
                    m[k][i] += -stations[i][0] - stations[i][1]
                    m[k][i] = max(0, m[k][i])
                    b[k][i] = min(b[k][i + 1], m[k][i] + stations[i][0])
                if stations[i][0] + m[k][i] <= startFuel:
                    return k + 1
        return -1


assert Solution().minRefuelStops(1, startFuel=1, stations=[])
assert Solution().minRefuelStops(100, startFuel=1, stations=[[10, 100]])
assert Solution().minRefuelStops(
    100, startFuel=10, stations=[[10, 60], [20, 30], [30, 30], [60, 40]]
)
from typing import List


class Solution:
    def minRefuelStops(
        self, target: int, startFuel: int, stations: List[List[int]]
    ) -> int:
        N = len(stations)
        dp = [0] * (N + 1)
        dp[0] = startFuel
        for i in range(N):
            for k in range(i, -1, -1):
                if dp[k] >= stations[i][0]:
                    dp[k + 1] = max(dp[k + 1], dp[k] + stations[i][1])
        for k in range(N + 1):
            if dp[k] >= target:
                return k
        return -1
class Solution:
    def minRefuelStops(self, target: int, startFuel: int, stations: List[List[int]]) -> int:
        stations = stations + [[target, 0]]
        N = len(stations)

        last = ans = 0
        tank = startFuel
        pq = []
        for i in range(N):
            dist = stations[i][0] - last
            tank -= dist
            while pq and tank < 0:
                tank += -heappop(pq)
                ans += 1
            if tank < 0:
                return -1
            last = stations[i][0]
            heappush(pq, -stations[i][1])
        return ans