刘总闭眼爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

def climb_stairs(n):
    way = [0, 1, 2]
    for i in range(3, n + 1):
        way.append(way[i - 1] + way[i - 2])
    return way[n]
def easy_climb(n):
    return easy_climb(n - 1) + easy_climb(n - 2) if n not in [0, 1, 2] else n

动态规划经典模型

1.线性模型

最经典的问题就是斐波那契数列的问题,每个数的值都是一个状态,可以用F[i]表示表示第i个数的值是多少。每个数都是由F[i-1]+F[i-2]转移而来。

另外一个经典的问题就是最长上升自序列(LIS),有一串序列,要求找出它的一串子序列,这串子序列可以不连续,但必须满足它是严格的单调递増的且为最长的。把这个长度输出。

示例:1 7 3 5 9 4 8 结果为4。

我们非常容易表示他的状态,我们用f[i]表示以第i个数结尾的,最大的上升自序列是多少?那么它是怎么转移的呢?非常容易想到肯定是从左边的的数转移而来,能转移的数满足什么条件呢?肯定是比a[i]更小的。

线性模式还可以拓展成二维问题,例如背包问题,用f[i][j]表示前i个物品,凑成大小为j的背包,最大的价值是多少。

这类问题非常的多,但是思路都是这样,无非就是从左往右,从上到下,从低维到高维进行转移。

2.区间模型

对于每个问题,都是由子区间推导过来的,我们称之为区间模型,下面是一个例子。

扫描二维码关注公众号,回复: 11235488 查看本文章

我们有一个连续的序列,每个序列上面都是一个数字c[i],每次我们都能够消灭一个连续的回文子序列,消灭之后左右会合并,成为一个新序列,问最少需要多少次才能够把整个序列消灭掉。回文就是从左到有从右到左读到的序列都是一样的。题目比较抽象,我们通过一些例子来说明这个问题吧?例如一开始的序列是1 4 4 2 3 2 1,那么我们最少需要2次,先消灭掉4 4 , 然后再消灭调1 2 3 2 1.第二个例子是 1 2 3 4 5 5 3 1,我们先消灭掉2 然后再消灭掉4, 最后消灭 1 3 5 5 3 1, 需要3次。

我们经常用f[i][j]来表示消灭i,j区间需要的代价,文末有链接详细叙述这个问题,大家感兴趣的可以看一看。

3.树状模型

我们在数据结构树上面进行寻求最优解、最大值等问题,上述我们讲的这个绩效考核就是一个树状模型,具体不再累叙。

实现的套路

我们实现动态规划算法,常用的是2个实现套路,一个是自底向上,另外一个是自顶向下。无论是何种方式,我们都要明确动态规划的过程,把状态表示状态转移边界都考虑好。

  1. 自底向上 ,简单来说就是根据初始状态,逐步推导到最终状态,而这个转移的过程,必定是一个拓扑序。如何理解这个拓扑序问题呢,甲总监下面有X,Y,Z两个小组,甲总监不会一拿到X组最优秀的三个人,就立马去跟A经理汇报,而是要等到Y,Z小组也选出来之后,也就是自己下面所有子问题都解决了,才会继续向汇报。如果推导的过程不是一个拓扑序,那么要么得到错误的结果,要么算法就要退化。

自底向上一般用来解决什么问题呢?那就是可以轻松确定拓扑序的问题,例如线性模型,都是从左往右进行转移,区间模型,一般都是从小区间推导到大区间。自底向上的一个经典实现是斐波那契数列的递推实现,即F[i] = F[i - 1] + F[i - 2] 。

  1. 自顶向下,也就是从最终状态出发,如果遇到一个子问题还未求解,那么就先求解子问题。如果子问题已经求解,那么直接使用子问题的解,所以自顶向下动态规划又有一个形象生动的名字,叫做记忆化搜索,一般我们采用递归的方式进行求解。

自顶向下,我们一般用在树上面,因为我们根据父结点,很容易找到所有的子问题,也就是所有的子结点,而自底向上的话,我们要去统计这个结点的所有兄弟结点是否已经实现。会稍微复杂一点,而且比较难理解。

无论是自顶向下还是自底向上,都只是代码实现的一种套路,随便你采用哪一个,都是可以解的,只是看你的选择而已。

动态规划,更多的还是要多练习,题目很多,但万变不离其宗,还是要多多练习。后面还会分享出更多动态规划面试算法真题,大家有兴趣的话可以关注。谢谢大家。

最后分享一个parse尤大Vue的博客:https://juejin.im/post/5e9faa8fe51d4546fe263eda

猜你喜欢

转载自blog.csdn.net/weixin_44659309/article/details/106152066