博客上解法很多,有贪心+标记搜索解有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ÿ