经典贪心问题之线段覆盖
各种类型的线段覆盖问题
本文为转载文章
问题1
问题描述:
\(1-L\)的一维区间上,有\(n\)条线段,线段两端点分别为\(l_i\),\(r_i\)。求覆盖全部的最小线段条数。
问题分析:
贪心。贪心策略:按\(l\)小\(r\)大的排序方式排序,得到第一条从 \(l_1=1\) 出发且\(r_1\)最大的线段,则第二条线段需要有\(l_2 \leq r_1\),且\(r_2\)尽可能大。同理第三条线段的\(l_3\leq r_2\)且\(r_3\)尽可能大。以此类推,很容易感觉到,该贪心策略已是最优策略。
问题2
问题描述:
\(1-L\)的一维区间上,有\(n\)条线段,线段两端点分别为\(l_i\),\(r_i\)。求不重叠的最大覆盖。
问题分析:
动态规划。将线段先按\(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条线段,线段两端点分别为\(l_i\),\(r_i\),线段的权值为\(v_i\)。求不重叠的最大权值和。
问题分析:
动态规划。和问题2的方法基本一样,只不过问题2的线段的权值是线段的长度:\(r-l+1\)。而现在的权值是给定的\(v_i\)。
————————————————
本文为CSDN博主「是哆啦D梦」的原创文章
原文链接:https://blog.csdn.net/weixin_43602607/article/details/115418285