问题1
- 问题描述:1 - L的一维区间上,有n条线段,线段两端点分别为li,ri。求覆盖全部的最小线段条数。
- 问题分析:贪心。贪心策略:按 l 小 r 大的排序方式排序,得到第一条从 l 1 _1 1=1 出发且 r 1 _1 1最大的线段,则第二条线段的 l 2 _2 2 需要 <= r 1 _1 1,且r 2 _2 2尽可能大。同理第三条线段的 l 3 _3 3<=r 2 _2 2且r 3 _3 3尽可能大。以此类推,很容易感觉到,该贪心策略已是最优策略。
问题2
- 问题描述:1 - L的一维区间上,有n条线段,线段两端点分别为li,ri。求不重叠的最大覆盖。
- 问题分析:动态规划。将线段先按 r 大 l 小的顺序先排序。
设 f[i] 为从区间 1 - i 的最大覆盖。vector存储以 r 为下标的 l 。dp从1 - L,若有以 i 为 r 的线段,则考虑是否放入该线段。
很显然的一点:dp数组一定是递增废话
不放入该线段则继承:dp[i] = dp[i-1],
放入该线段则:dp[i]=max(dp[vec[i][j]-1]+r-l+1),0<=j<vec[i].size()
问题3
- 问题描述:1 - L的一维区间上,有n条线段,线段两端点分别为li,ri,线段的权值为vi。求不重叠的最大权值和。
- 问题分析:动态规划。和问题2的方法基本一样,只不过问题2的线段的权值是线段的长度:r-l+1。而现在的权值是给定的vi。