动态规划,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
动态规划简介,核心思想,案例,解题思路。
1 什么是动态规划
动态规划(Dynamic programming,DP),通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法(自底向上)。动态规划常常适用于有重叠子问题和最优子结构性质的问题。
动态规划把子问题的答案保存起来,以减少重复计算。再根据子问题答案反推,得出原问题解的一种方法。
2 核心思想
动态规划最核心的思想,就在于拆分子问题,记住过往,减少重复计算。
3 例子
| 12
 3
 
 | 题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | 
 
 func climbStairs(n int) int {
 if n <= 2 {
 return n
 }
 return climbStairs(n-1) + climbStairs(n-2)
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | 
 var memo map[int]int
 func climbStairs(n int) int {
 
 if memo == nil {
 memo = make(map[int]int)
 }
 
 if n <= 2 {
 return n
 }
 
 if tmp := memo[n]; tmp != 0 {
 return tmp
 }
 
 memo[n] = climbStairs(n-1) + climbStairs(n-2)
 return memo[n]
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 | 
 
 
 
 func climbStairs(n int) int {
 if n <= 2 {
 return n
 }
 before1 := 1
 before2 := 2
 res := 0
 for i := 3; i <= n; i++ {
 res = before1 + before2
 before1 = before2
 before2 = res
 }
 return res
 
 | 
4 解题思路
- 穷举分析
- 确定边界
- 找规律(确定最优子结构)
- 写出状态转移方程