题目链接:出租出的最大盈利
题干解读:
现有一个rides数组,里面包含了一系列乘客信息(上车点,下车点,小费),你驾车(只能沿一个方向开)接乘客,而且你的车上最多只能容纳一名乘客,你需要给出最优接单方案。
思路分析:
这是一个最优化问题,在每一个乘客处,你有接和不接两种选择,若将乘车信息数组按照下车顺序进行升序排列,你将发现这个优化问题无后效性(你在接第i位乘客时,你所能获得的最大利益只和第j位乘客(目的地刚好在第i位乘客上车之前下车的乘客)那里所获得的最大利益相关,而和第j位乘客之前的那些乘客无关),可以看出可以采用动态规划进行解题;
状态转义方程:dp[i] = max(dp[i - 1], dp[j] + rides[i][1] - rides[i][0] + rides[i][2])
其中dp[i]表示在到达第i位乘客目的地时所能获得的最大利润;
class Solution {
public:
long long maxTaxiEarnings(int n, vector<vector<int>>& rides) {
sort(rides.begin(), rides.end(), [&](const vector<int> &r1, const vector<int> &r2) -> bool {
return r1[1] < r2[1];
});
int m = rides.size();
vector<long long> dp(m + 1);
for (int i = 0; i < m; i++) {
int j = upper_bound(rides.begin(), rides.begin() + i, rides[i][0], [](int x, const vector<int> &r) -> bool {
return x < r[1];
}) - rides.begin();
dp[i + 1] = max(dp[i], dp[j] + rides[i][1] - rides[i][0] + rides[i][2]);
}
return dp[m];
}
};