题意:
给出m个可能重叠的时间段(给出开始时间和结束时间),每个时间段都有与之对应的产奶量。现在你在这些时间段中(可以是一个或多个,时间不能重叠)给奶牛挤奶,每次挤奶后要休息r小时,求n个小时内的最大产奶量。
思路:
一读完题就知道是老经典的dp问题了。先按开始时间递增给时间段排序(其实按结束时间排序也可以,都差不多),然后按顺序遍历每个时间段now,同时遍历以往的状态tmp。如果tmp的结束时间+r <= now的开始时间(保证时间不重叠), 那么就用以往的状态加上当前的权值,去更新当前的状态,取max。
综上所述,不难推出动态转移方程:dp[i] = max(dp[i], dp[j] + a[i].w);
Code:
int dp[1000005];
struct node {
int s, e, w;
}a[1005];
int cmp(node a, node b) {
if (a.s != b.s) return a.s<b.s;
else return a.e<b.e;
}
int main() {
int n, m, r;
cin >> n >> m >> r;
for (int i = 1; i <= m; i++)
cin >> a[i].s >> a[i].e >> a[i].w;
sort(a+1, a+m+1, cmp);
int ans = -1;
for (int i = 1; i <= m; i++) {
dp[i] = a[i].w;
for (int j = 1; j < i; j++) {
if (a[j].e+r <= a[i].s)
dp[i] = max(dp[i], dp[j] + a[i].w);
}
ans = max(ans, dp[i]);
}
cout << ans << endl;
return 0;
}