看着像背包问题,但看着又不像。
dp[end]表示end时刻获得的最大快乐值,dp[end]=max(dp[end],dp[start]+w);
当然dp[a]可能比dp[b] (a>b)小。所以需要一个mx来记录当前最大值。
所以 dp[end]=max(dp[end],mx+w);
附代码和注释:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, t;
class node {
public:
int s, e, w;//开始时间 结束时间 快乐值
node(int _s, int _e, int _w) : s(_s), e(_e), w(_w) {
if (e > t) e = t;
}
};
int main() {
cin >> n >> t;
vector<node> nums;
for (int i = 0; i < n; i++) {
int a, b, c;//快乐 持续 几个开始时间
cin >> a >> b >> c;
for (int j = 0; j < c; j++) {
int k;
cin >> k;
nums.push_back(node(k, k + b, a));
}
}
sort(nums.begin(), nums.end(), [](node a, node b) {
return a.s < b.s;
}); //按开始时间排序
int p = 0;
int mx = 0;
vector<int> dp(1e6 + 7); //记录dp[x] x时刻获得的最大快乐值
for (int i = 0; i <= t; i++) {
mx = max(mx, dp[i]); //记录当前i时刻能获得的最大的快乐值
while (p < nums.size() && nums[p].s == i) { //因为有可能一个开始时间有多个活动同时开始,所以用while
dp[nums[p].e] = max(dp[nums[p].e], mx + nums[p].w);
p++;
}
}
cout << max(mx, dp[t]); //最大快乐值
return 0;
}