程序基本算法习题解析 动态规划-线段覆盖: 数轴上有n条线段,线段的两端都是整数坐标,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合),且线段价值之和最大。

题目:

线段覆盖:数轴上有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)

按右端点的升序排序后如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值