博客上解法很多,有贪心+标记搜索解有DP解,但是目前为止没看到DP思路解的原理或者证明,大多数都是直接转化问题,并没有说清楚为什么问题间可以如此转化,本文给出Onlgn动规解及证明
题目大意
现有n根木棒,已知它们的长度和重量。要用一部木工机一根一根地加工这些木棒。该机器在加工过程中需要一定的准备时间。
木工机需要的准备时间如下:
(1)第一根木棒需要1min的准备时间;
(2)在加工了一根长为l ,重为w的木棒之后,接着加工一根长为l ‘(l ≤ l’ ),重为 w’ ( w≤w’)的木棒是不需要任何准备时间的,否则需要一分钟的准备时间。
给定n根木棒,找到最少的准备时间。例如现在有长和重分别为(4,9),(5,2),(2,1),(3,5)和(1,4)的五根木棒,那么所需准备时间最少为2min,顺序为(1,4),(3,5),(4,9),(2,1),(5,2)。
思路
二维排序问题,首先转化为一维问题,先对长度进行排序,最后在此基础上找出几个重量上升子序列,覆盖原重量序列,几个重量上升子序列的数量尽量少,比如例子中的4 5 9 和1 2 两个重量上升子序列,即以尽量少的上升子序列覆盖原序列
动规解及证明:
动规解->以尽量少的上升子序列覆盖原序列=最长递减子序列的长度
现证明->以尽量少的上升子序列覆盖原序列=最长递减子序列的长度
首先说明几个概念:1)互斥元素,上升子序列表示递减的元素是互斥的,比如6,5,3,它们永远不可能出现在同一个上升子序列中。2)在求上升子序列中,最长递减子序列按照1)中互斥元素的概念又可以称为最长互斥子序列。
证明:
step1:是让序列中所有的元素都落在尽量少的上升区间里,理想情况就是所有的元素都在同一个上升序列里,即原序列是递增的
step2:我们先考虑上升序列数最少的情况,假设这个序列里面,除了一定不能在同一个上升序列的元素即有些元素互斥不能在同一个上升序列里,其他的元素都可以分配到某一个已经存在的上升序列中
step3:显然互斥元素必须各自在一个上升序列中,那么我们考虑 最少的上升序列数>=最长互斥元素序列的中元素个数(显然)。即把除了最长互斥元素序列之外的所有元素,都分配到某一个最长互斥元素序列中的某一个元素所在的上升序列中,显然这种情况若能成功,则一定是最少的上升序列数
step4:上面我们说了,最长互斥元素序列中每一个元素都要各自在一个上升序列。现在我们证明最长互斥元素序列每一个元素所在的上升序列可以覆盖原序列
假设一个序列长度为1-n,最长互斥序列的下标是k1,k2,k3,k4,有k1>k2>k3>k4

序列的排列可以表示为
num1,num2,k1…k2…k3…k4…n
case1:k1之前的元素与k1互斥,即num1或num2>k1,因为假设最长互斥序列为k1 k2 k3 k4,若num1或num2>k1,那么num1或2与k1、2、3、4组成了新的最长互斥序列,矛盾
case2:num1与num2不互斥,即num1<num2,那他们都属于k1所在的上升序列,因为它们都小于k1,即num1,num2,k1这个子序列,如 1 6 9 7 3 2,1 6都属于9(即k1)所在的上升子序列中
case3:num1与num2互斥,即 num1>num2,且num1<k1且num2<k1(case1说了num1和2一定小于k1),显然num1和num2各自可以存在在k1所在的序列里,但不可以同时存在,现在我们证明它们一定有一个可以存在在k2或3或4所在的序列里。
我们使num1属于k1序列(因为num1<k1,所在这是显然可以的),现在假设num2不属于k2所在的上升序列,那么推出num2>k2,此时因为num1>num2,而num2>k2、3、4,那么num1、2与k2、3、4组成了新的最长下降子序列,矛盾。因此num2一定满足num2<k2,那么num2一定可以属于k2序列。
那么由case1、case2与case3的情况推广到num1,num2,num3,num4…k1…k2…k3…k4…n序列,我们可以得到结论:对k1前的所有元素得到,一定可以属于k1或k2所在的序列。再推广此结论到k1-k2间的元素得,k1-k2间的所有元素一定属于k2或k3所在的上升序列,同理得k2-k3、k3-k4,对于k4-n间的元素,一定可以属于

博客探讨ZOJ1025问题,通过动态规划方法证明以最少的上升子序列覆盖原序列等于最长下降子序列的长度。文章首先介绍问题背景,然后详细阐述转换思路,最终给出O(n log n)复杂度的解决方案和证明过程。
最低0.47元/天 解锁文章
641

被折叠的 条评论
为什么被折叠?



