ZOJ1025 证明以最少的上升子序列覆盖原序列=最长下降子序列的长度

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

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值