dp与贪心

心得

为什么要用动态规划,因为想优化枚举,
为什么要贪心,因为想优化dp

dp&贪心|分治

dp规划优于递归暴力枚举,在于它在面对n时,利用了n-1的结果,f(sn,n)=max(an+f(sn-an,n-1),f(sn,n-1))

最优子结构:选择某某后必然可以选择f(sn-an,n-1)

贪心算法不用比较an+f(sn-an,n-1)与f(sn,n-1),f(sn,n)=an+f(sn-an,n-1),f(sn,n)一定会选择an需要证明
分治法

重叠子问题:fn会用到fn-1,

分治法不具这种结构,

实现方式

1.自底而上:1~n,使用备忘,来避免递归
2.自顶而下:n~1,递归调用,比自底而上慢常量级,但可以去掉某些完全不用的子问题

经典问题:
钢条切割 矩阵链最少计算次数 LCS
递归式 A max(m[i,k]+m[k+1,j]+pip(k+1)p(j+1) l(m,n)=l(m-1,n-1)+1/min(l(m,n-1),l(m-1,n))
idea X[m]!=Y[n]不可用贪心

例题讲解:

无重叠区间

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。

首先反面考虑,需要移除区间的最小数量\(\iff\)需要保留的最大数量
用贪心的话,我们试图找到这样一个区间,在这个区间两侧的最多区间N'加上这个区间为整体的最多区间N
容易看见这样的区间不能包含其他区间,而如果只是与其他区间重叠的话呢?
假设不选这个区间A而选其他与这个区间重叠的A',试图找到A的性质使得如果选A'可以那么选A更可以,
双侧的话一定会包含,看一看单侧呢,因此A为右侧最左的区间或左侧最右的区间

跳跃

image
容易想到选择跳最后一步的位置下标l最小的,
验证,假设l'>l,最后一步l'跳k步,则跳k步一定有一步t跨越l,令t这一步停在l,且之后一直停,这说明l'可以,l必可以
故上述选择可用于贪心

待更_最优二叉搜索树

补充问题:

最长递增子序列
  1. 滑动窗口,O(n);
posted @ 2022-10-01 16:27  clfire  阅读(106)  评论(0编辑  收藏  举报