/*
translation:
一头奶牛每天在一些特定的时间段产奶,每次产奶之后必须休息r分钟。现在给出每天的产奶间隔和
每个间隔的产奶量,求该头奶牛的一天可以产奶最高多少?
solution:
LIS, dp即可解。
note:
1:一开始被给出的时间n所干扰,但是这其实是无用条件。
2:善于从题目中抽象出经典模型。
3:poj上的FJ和Bessie是真爱,tm哪儿都有他俩!!
date:
2016.9.1
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1001;
struct Interval {
int s, e, d;
Interval(int s_, int e_, int d_) : s(s_), e(e_), d(d_) {}
Interval() {}
bool operator < (const Interval& rhs) const {
if(s == rhs.s) return e < rhs.e;
else return s < rhs.s;
}
} intervals[maxn];
int n, m, r;
int dp[maxn]; //以第i个间隔为最后间隔所获得的最优解
int main()
{
//freopen("in.txt", "r", stdin);
while(~scanf("%d%d%d", &n, &m, &r)) {
for(int i = 0; i < m; i++) {
scanf("%d%d%d", &intervals[i].s, &intervals[i].e, &intervals[i].d);
}
sort(intervals, intervals + m);
memset(dp, 0, sizeof(dp));
int ans = -1;
for(int i = 0; i < m; i++) {
dp[i] = intervals[i].d;
for(int j = 0; j < i; j++) {
if(intervals[i].s - intervals[j].e >= r) {
dp[i] = max(dp[i], dp[j] + intervals[i].d);
}
}
ans = max(ans, dp[i]);
}
printf("%d\n", ans);
}
return 0;
}
poj3616(LIS)
最新推荐文章于 2020-03-12 23:29:49 发布
本文详细介绍了如何解决POJ3616编程问题,重点探讨了最长递增子序列(LIS)的算法实现,包括动态规划的方法和关键步骤,帮助读者理解并解决此类问题。
摘要由CSDN通过智能技术生成