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