http://poj.org/problem?id=3616
题意:给出一些牛开始产奶和结束产奶的时间还有他们能产出的价值,每时每刻只能有一头牛产奶而且相邻的产奶的两头牛必须经过R小时,问能获得的最大产奶价值是多少。
解法:DP,我是直接暴力去找每头牛前面满足结束时间last.end <= now.start - r的牛,取max,更新。
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int dp[1000005];
struct node {
int s, e, val;
}cow[1005];
bool cmp(node a, node b) {
if(a.e == b.e) {
if(a.s == b.s)
return a.val > b.val;
return a.s < b.s;
}
return a.e < b.e;
}
int main() {
int n, m, r;
cin >> n >> m >> r;
for(int i = 1; i <= m; i++) {
scanf("%d%d%d", &cow[i].s, &cow[i].e, &cow[i].val);
}
sort(cow + 1, cow + m + 1, cmp);
for(int i = 1; i <= m; i++) {
dp[i] = dp[i - 1];
if(cow[i].s - r >= 0) {
int tmp = cow[i].s - r;
int j = i - 1;
for(; j > 0; j--) {
if(cow[j].e <= tmp)
dp[i] = max(dp[i], dp[j] + cow[i].val);
}
}
dp[i] = max(dp[i], cow[i].val);
}
cout << dp[m] << "\n";
return 0;
}