每日总结2021.5.7

1.最长上升子序列优化:贪心+二分,将n^2时间复杂度优化成nlogn。

思路:我们开一个数组q,下标代表子序列长度。对于任意一个子序列,如果某个数能加在它后面,必定能加在序列结尾的数字比它更小的那个序列中,所以对于某个长度的子序列我们只需要纪录序列结尾最小的那一个就行了。然后基于贪心的思想:我们每次尽量保留小的用大的去更新,因为小的适用范围更广。对于某个a[i],找到小于a[i]的最大值,把a[i]加到它后面,如果找不到小于a[i]的,则说明只能新开一个存a[i]。而且对于我们开的数组纪录的数字是有单调上升的,所以我们在找的时候可以用二分查找。对于单调性的证明如下:

对于q[i],q[i+1],假设q[i+1]<=q[i]的话,那么对于长度为i+1的序列,倒数第二个数必定小于q[i],所以必定可以用这个数去更新q[i],所以就与我们q数组的定义有矛盾了,因为我们定义的q数组存的就是子序列末尾值最小的数,所以假设就不成立。所以是单调上升的。证明完毕。

2.AcWing\1010. 拦截导弹

给定一行数字,少于1000个,代表导弹的高度,现有导弹拦截系统,可以发射拦截导弹,该拦截系统有个特点,即第一次可以到达任意高度,但之后发射的拦截导弹的高度都不高于上次发射的高度,问一个拦截系统最多拦截多少导弹?拦截完所有导弹最少需要多少个拦截系统?

思路:首先对于第一问很简单,就是最长上升自子序列模型,只不过要求的是最长非上升子序列。优化方式和最长上升子序列模型一样。但对于第二问,就是让求最少需要多少个非上升子序列可以把序列全部覆盖。这里我们还是用类似于最长上升子序列优化的方法即贪心+二分的思想,开一个数组纪录序列的最后一位数,因为要的非上升子序列,所以我们尽量保留较大的,所以对于任意a[i],我们用大于等于a[i]最小的那个去更新。如果没有就新开一个。

贪心证明(通常有两种方法(1)调整法(2)反证法):记贪心得到解为A,最优解B,要证A==B,我们只需证A<=B并且A>=B,就行了,因为B是最优解,很显然A>=B。接下来证A<=B。

先假设对于某个数x,通过贪心方法接在某个序列后面 和以最优解的方式 第一次出现不同的时候:

贪心方案…a x…

最优解方案…b x…

根据贪心方案的特点,a是大于x的最小的数,所以b>=a。所以贪心方案 x… 那段一定可以换到 b 后面。因为a>=x,所以最优解方案的x…那段也一定可以放到a后面,而且序列个数没有增加,所以对于最优解方案总数可以通过调整变成贪心方案,且不增加序列个数,所以B>=A。综上A==B,完毕。

而且q数组存的数也是具有单调性证明如下:

对于第一个数肯定可以看成单调,对于第二个数,根据贪心方案的性质,如果第一个数大于等于它,则用它替换第一个数,若小于它新开一个系统同时用下标纪录系统个数,保持单调,对于之后的任意数都是如此。因此可以用二分优化成nlogn的复杂度。

重点:是不是觉得和最长上升子序列模型的优化非常像?实际上最长上升子序列的长度和完全覆盖需要的最少非上升子序列个数是对偶问题,答案是一模一样的。

总结:最长上升子序列的长度和完全覆盖所需非上升序列的最少个数是一样的。

3.\187. 导弹防御系统 大意: 多组测试样例,没组一个n,接下来一行n个数字,求上升子序列和下降子序列个数和的最小值。

和上题差不多,基于贪心的思想,只不过对于某个数我们无法判断到底加到上升子序列更好还是加到下降子序列中更好,又因为数据不大,所以用dfs,或者迭代加深。因为用bfs的话会爆内存,并且状态不容易表示,这也提了个醒并不是所有的最小步数都用bfs,做题的时候不要一股脑扎到bfs中。

两种写法 (1)dfs+纪录全局最小值 (2)迭代加深

(1):搜索时纪录三个参数,当前用到的数,上升子序列的个数,下降子序列的个数。

剪枝:当上升子序列个数+下降子序列个数>=ans时,就没搜的必要了。直接回溯。

注意up里面是用来找上升子序列的,但里面存的数是单调非递增的,down数组正好反过来。(可以根据前几个数来判断up和down数组里存的数的单调性)

(2)迭代加深做法类似,只不过设了一个上限作为剪枝条,一但超过限制就认定搜索失败。其他和dfs一样。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值