爬楼梯:可以一次跳一个台阶,也可以一次跳两个台阶 问:n层台阶有几种跳法: 问题的解决: 1、递归解决: 问题分析:跳n阶两种选择一种是从n-1层跳一层台阶,第二种是从n-2层跳两层 从n-1层又分为两个问题于是可以递归解决: func climbStairs1(n int) int { if n==1{ return 1 } if n==1{ return 2 } return climbStairs(n-1)+climbStairs(n-2) } 但是递归问题会出现大量的重复计算,当n=10的时候会发现8计算了两次而7计算了三次,所以动态规划问题就是避免大量重复计算的问题。 2、动态规划 动态规划的核心思想:拆分子问题,记住过往,减少重复计算。 动态规划的要素: 1、最优子结构 2、状态转移方程 3、边界 4、重叠子问题 很明显最优子结构是f(n-1)+f(n-2), 状态转移方程:f(n)=f(n-1)+f(n-2) 边界当然是f(1)和f(2) 重叠子问题当然是f(3)=f(1)+f(2) 分析问题后有如下代码 func climbStairs(n int) int { if n == 1 { return 1 } if n == 2 { return 2 } a := 1 b := 2 temp := 0 for i := 3; i <= n; i++ { temp = (a + b) a = b b = temp //i是台阶层数,当n=3时,a=1,b=2当然是f(3)=f(1)+f(2) //当n=4的时候此时a=2,且b=3,f(4)=f(2)+f(3) } return temp }