[wikioi]线段覆盖 2
http://wikioi.com/problem/3027/
# 有个小错误调了半天,最终发现sort(line, line+N)错了,后面那个是exclusive的,所以要line+N+1。
# 按照右端点从小到大排序。原因是循环结构中是i从1到n, i比较小的时候尽可能选右端点比较小的,这样才可以为后面的线段留下更大的空间。
# f[i]表示:算前i条线段时,选上第i条线段,能获得的最大价值。f[i]=max{f[j]}+c[i] (if 不重合)
#include <cstdio> #include <iostream> #include <algorithm> #include <memory.h> #define MAX(a, b) a>b?a:b #define LEN 1005 using namespace std; struct Line { int left; int right; int value; }; int N; Line line[LEN]; int F[LEN]; bool comp(Line a, Line b) { return a.right < b.right; } void init() { memset(F, 0, sizeof(F)); memset(line, 0, sizeof(line)); scanf("%d", &N); for (int i = 1; i <= N; i++) { scanf("%d%d%d", &line[i].left, &line[i].right, &line[i].value); } } int main() { init(); sort(line, line+N, comp); int ans = 0; for (int i = 1; i <= N; i++) { F[i] = line[i].value; for (int j = 1; j < i; j++) { if (line[j].right <= line[i].left) { F[i] = MAX(F[j] + line[i].value, F[i]); } } ans = MAX(F[i], ans); } printf("%d\n", ans); return 0; }