附上b站的学习链接
https://www.bilibili.com/video/BV1r84y1379W/?vd_source=33f00026602fc92e30b53bb28729c59c
爬楼梯案例
假设有一个楼梯,总共有 n 级台阶。每次你可以选择爬 1 级或 2 级台阶。你需要计算出有多少种不同的方法可以爬到楼梯的顶部。
核心思路
动态规范的核心思路是用子问题来解决母问题,采用结果反推,用到了递归的思想。其中需要确认最小子问题的结果,和用子问题和母问题的关系的公式。
假如只有1个台阶,那只有一种方式(爬1次1级)
假如有2个台阶,那有两种方式(爬2次1级,或者爬1次2级)
假如有3个台阶,这里用反推的办法,回到你只要用爬一次之前(你可能爬1次或者你可能爬2次),到达3级台阶,假如你需要爬1次(你已经到达了2级台阶),或者假如你需要爬2次(你已经到达了1级台阶),这里爬楼梯的方法,分成了两个子问题,爬1级台阶有多少种方式和爬2级台阶有多少种方式。爬3级台阶需要爬1+2= 3次
假如有4个台阶,这里还是用反推的办法,假如你最后一步爬台阶,你最后一步可能爬1级(到达了3级台阶)或者可能爬2级(到达了2级台阶),这里也分成了两个子问题,爬3级台阶和爬2级台阶有多少种方式,爬4级台阶需要爬3 + 2 = 5次
这里就总结了一个计算公式:
当n = 1 时 f( 1 ) = 1
当n = 2 是 f( 2 ) = 2
当n > 2 时 f( n ) = f( n - 1 ) + f( n -2 )
这个公式用递归很好写
判断输入的值,根据情况返回值(当n>2)时,这里用到了递归
递归的空间优化的办法:
用记忆化搜索:用一个数组保存结果,如果有i级台阶的结果,就不用继续计算了,就把i级台阶的结果返回给它了
也可以不用递归,用一个循环和数组来写,数值赋初值,从第三级台阶这里循环,用公式计算后面的结果保存在数组里面,然后继续计算,放到数组的下一个值