POJ 3616 Milking Time(DP)

来源:互联网 发布:卡巴斯基 知乎 编辑:程序博客网 时间:2024/05/27 09:46

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;}