题目:
线段覆盖:数轴上有n条线段,线段的两端都是整数坐标,坐标的范围为0~1000000,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合),且线段价值之和最大。输入第一行一个整数n(n<=1000),表示有多少条线段接下来的n行,每行3个整数ai,bi,ci,分别代表第i条线段的左端点ai,右端点bi,价值ci。输出能够获得的最大价值。
思路:
①首先定义一个结构体Line,存放各线段的左端点、右端点以及其价值;
②再将线段按右端点的升序进行排序;定义一个maxValue数组,maxValue[i]表示以线段 i 为右边界的线段最大价值。
③对于每一条线段 i,计算其最大价值的公式为:maxValue[i] = max{ maxValue[i-1] , line[i].v + maxValue[j] },其中线段 j 为线段 i 之前最靠近线段 i 且与线段 i 不重合的线段。line[i]是一个结构体,line[i].v表示线段 i 的价值。因此可以按照排序后的下标从小到大对线段进行遍历,求其最大价值。
看文字叙述大概率已经晕了,但是不慌,看下面的例子应该就理解了:
(6条线段,左端点、右端点、价值分别为 1 2 3;1 3 1;2 4 3;3 4 10;4 6 5;5 6 8)
按右端点的升序排序后如下: