Problem: 2008. 出租车的最大盈利
思路
有几个点:
- 往前走意味着第
i
个地点的盈利一定大于等于第i-1
个地点;- 状态方程
dp[i] = max(dp[i], dp[start]+i-start+tip)
。
解题方法
- 初始化
dp
和哈希表mp
; - 将
rides
内的数据放到哈希表内:key
为终点,value
为起点和小费组成的二元组; - 从起点开始计算
dp[i]
,因为后面项依赖于前面项,正如思路第一点所提到的; - 返回到最远地点的状态即可,此时盈利大于等于之前的盈利,因此是最大值。
复杂度
时间复杂度:
O
(
n
+
m
)
O(n+m)
O(n+m),
n
n
n为地点数目,
m
m
m为 rides
数目。
空间复杂度: O ( n + m ) O(n+m) O(n+m)
Code
class Solution {
public:
long long maxTaxiEarnings(int n, vector<vector<int>>& rides) {
long long dp[n+1];
dp[0] = 0;
unordered_map<int, vector<pair<int, int>>> mp;
for (auto r: rides) {
mp[r[1]].push_back(make_pair(r[0], r[2]));
}
for (int i=1; i<=n; i++) {
dp[i] = dp[i-1];
for (auto x: mp[i]) {
dp[i] = max(dp[i], dp[x.first]+i-x.first+x.second);
}
}
return dp[n];
}
};