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为右侧最左的区间或左侧最右的区间
跳跃
容易想到选择跳最后一步的位置下标l最小的,
验证,假设l'>l,最后一步l'跳k步,则跳k步一定有一步t跨越l,令t这一步停在l,且之后一直停,这说明l'可以,l必可以
故上述选择可用于贪心
待更_最优二叉搜索树
补充问题:
最长递增子序列
- 滑动窗口,O(n);
愿偿少年泪,犹趁未老时!
本文来自博客园,作者:clfire,转载请注明原文链接:https://www.cnblogs.com/sky1water/p/16747147.html