题目链接:力扣
题解:动态规划 + 二分
1. 先将数组按end从小到大排序(多关键字的题通常都需要先将一个关键字排序,做降维处理)
2. dp[i]:前i个买家可获得的最大金币数
3. dp[i] = max(dp[i - 1], gold[i] + dp[j]); end[j] < start[i]
j的值可以二分得到
总的时间复杂度O(nlogn),空间复杂度O(n)
代码示例:
class Solution {
public:
int maximizeTheProfit(int n, vector<vector<int>>& offers) {
int m = offers.size();
sort(offers.begin(), offers.end(), [](vector<int>& a, vector<int>& b)->bool { return a[1] < b[1]; });
vector<int> dp(m);
int ans = dp[0] = 0;;
auto end = ++offers.begin();
for (int i = 0; i < m; ++i, ++end) {
if (i) dp[i] = dp[i - 1];
auto itr = lower_bound(offers.begin(), offers.end(), vector<int>{0, offers[i][0]}, [](const vector<int>& a,const vector<int>& b)->bool { return a[1] <= b[1]; });
dp[i] = max(dp[i], offers[i][2] + (itr == offers.begin() ? 0 : dp[itr - offers.begin() - 1]));
ans = max(ans, dp[i]);
}
return ans;
}
};