解题思路:
动态规划
dp[i]表示,加油i次最远可以到达的距离;
关键,如果经过j次加油可以到达i这个位置的加油站,那么就可以在这个站加油获得油量,从而更新dp[j+1]
class Solution {
public:
//stations[0]是加油站位置,stations是加油站有多少汽油
int minRefuelStops(int target, int startFuel, vector<vector<int>>& stations) {
int n=stations.size();
//dp[i]代表加油i次能够走到的最远距离
//因为一共有n个加油站,因此可以加油n次,包括不加油的0次
vector<long>dp(n+1,0);
dp[0]=startFuel; //一次油不加,一开始有多少油,就走多远
for(int i=0;i<n;++i){
//从第1个(下标为0)的加油站开始
for(int j=i;j>=0;--j){
//如果可以经过j次加油到达i这个加油站,那么就可以在这个站加油获得油量
if(dp[j]>=stations[i][0]){
dp[j+1]=max(dp[j+1],dp[j]+stations[i][1]);
}
}
}
for(int i=0;i<=n;++i){
if(dp[i]>=target)
return i;
}
return -1;
}
};
改变题干:
初始有100单位燃油;
油箱有最大容量100单位燃油;
其他不变;
class Solution {
public:
//stations[0]是加油站位置,stations是加油站有多少汽油
int minRefuelStops(int target,vector<vector<int>>& stations) {
int n=stations.size();
//dp[i]代表加油i次能够走到的最远距离
//因为一共有n个加油站,因此可以加油n次,包括不加油的0次
vector<long>dp(n+1,0);
dp[0]=100; //一次油不加,一开始有100升油,就走多远
for(int i=0;i<n;++i){
//从第1个(下标为0)的加油站开始
for(int j=i;j>=0;--j){
//如果可以经过j次加油到达i这个加油站,那么就可以在这个站加油获得油量
if(dp[j]>=stations[i][0]){
//在该站获得油量以后,最多也只能再往前走100
dp[j+1]=max(dp[j+1],dp[j]+min(100,stations[i][1]));
}
}
}
for(int i=0;i<=n;++i){
if(dp[i]>=target)
return i;
}
return -1;
}
};