描述
数轴上有 n(n ≤ 1000) 条线段,线段的两端都是整数坐标,坐标范围在 0 ∼ 1000000,每条线
段有一个价值,请从 n 条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合)且线
第一行一个整数 n,表示有多少条线段。
接下来 n 行每行三个整数, a i ,b i ,c i ,分别代表第 i 条线段的左端点 a i ,右端点 b i (保证左端点
3
1 2 1
2 3 2
1 3 4
样例输出
数轴上有 n(n ≤ 1000) 条线段,线段的两端都是整数坐标,坐标范围在 0 ∼ 1000000,每条线
段有一个价值,请从 n 条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合)且线
段价值之和最大。
第一行一个整数 n,表示有多少条线段。
接下来 n 行每行三个整数, a i ,b i ,c i ,分别代表第 i 条线段的左端点 a i ,右端点 b i (保证左端点
< 右端点)和价值 c i 。
输出能够获得的最大价值
3
1 2 1
2 3 2
1 3 4
样例输出
4
分析
先将线段排序。按照右端点从小到大排序。原因是循环结构中是 i 从 1 到 n, i 比较小的时候尽
可能选右端点比较小的,这样才可以为后面的线段留下更大的空间。
设状态为 f[i],表示前 i 条线段时,选上第 i 条线段,能获得的最大价值。状态转移方程如下:
f[i] = max{f[j]} + c[i],2 ≤ i ≤ n,1 ≤ j ≤ i − 1,且 b[j]<=a[i]
b[j]<=a[i] 表示 j 的右端点在 i 的左端点左边,即不重合。
输出 f[i] 数组中的最大值。