Идея скопирована с https://leetcode.com/problems/minimum-number-of-refueling-stops/solution/,
Давайте определим dp [i], самое дальнее местоположение, которое мы можем получить, используя i i stop stop.Это связано с тем, что нам нужен самый маленький i, для которого dp [i]> = target.
Алгоритм
Давайте обновим dp, рассматривая каждую станцию по порядку.Без станций ясно, что мы можем получить максимальное расстояние startFuel с 0 остановками заправки.
Теперь давайте посмотрим на шаг обновления.При добавлении станции станции [i] = (местоположение, пропускная способность), в любой момент, когда мы можем достичь этой станции с t остановками заправки, теперь мы можем достигнуть пропускной способности дальше с t + 1 остановками заправки.
Например, еслимы могли достичь расстояния 15 с 1 остановкой заправки, и теперь мы добавили станцию в месте 10 с 30 литрами топлива, а затем потенциально могли бы достичь расстояния 45 с 2 остановками заправки.
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) , пространство, используемое дп.