青蛙与动态规划
1. 问题 之前遇到过这么一个问题{:target="_blank"} ,说有一只青蛙,它想跳到 n 层的楼梯上面去,由于自身原因,它每次只能选择跳 1 层或者 2 层。 问,青蛙有多少种跳法? 第一眼看到这个问题的时候有点蒙,不知道从何下手。不妨先从可见的楼梯层数 n 入手,设求青蛙跳法的方法是 f(n)。 那么当 n=1 时 f(n)=1, n=2 时 f(n)=2, n=3 时 f(n)=3, n=4 时 f(n)=5 … 很明显,f(n) 是一个斐波那锲数列的方法,当前数等于前两个数之和,所以有 f(n)=f(n-1)+f(n-2)。 其实从另一个角度想也可以想明白,假设我是那只青蛙,站在 n 层的楼梯脚下,我有 f(n) 种跳法,现在我能选择的是跳 1 层还是跳 2 层。当我选择跳 1 层时,我接下来的跳法还有 f(n-1) 种;当我选择跳 2 层时,我接下来的跳法还有 f(n-2) 种。所以我在还没有选择之前的跳法应该等于我这两种跳法之和,所以有 f(n)=f(n-1)+f(n-2)。 2. 解答 2.1 递归 上面的思路有了,我们很容易就可以用代码实现了。 public int climbStairs(int n) { if (n <= 0) return 0; if (n == 1) return 1; if (n == 2) return 2; // f(n)=f(n-1)+f(n-2) return climbStairs(n - 1) + climbStairs(n - 2); } 上面的代码虽然可以解决问题,但是会出现很大一部分的重复运算。 如下图所示,当 n=6 时,我们计算了 2 次 f(4), 3 次 f(3)。 2....