动态规划(Dynamic Programming)

1. 递归+记忆化 --> 递推

2. 状态的定义:opt[n], dp[n], fib[n]

3. 状态转移方程:opt[n] = best_of(opt[n-1], opt[n-2], …)

4. 最优子结构

传统的斐波那契数列的解法,时间复杂度O(2^N),使用简单的递归算***有很多的冗余计算

使用内存数组进行记忆化,降低时间复杂度到O(N)

使用递推,从下往上推,也会快速很多

从左上角走到右下角有多少种走法?

可以看做是往下走到达终点的走法数+往右走到达终点的走法数

这种方法跟斐波那契数列一样,会产生大量重复计算的问题,解决办法还是加上存储
如果使用递推,就从下往上开始走,反着进行

这里写出状态转移方程

含义就是,ij格子到达终点的方法数,等于右边格子的方法数加上下边格子的方法数之和,那么我们就可以填满整个图

时间复杂度为O(MN)

总结:

最优子结构:通过求解原生问题,同时能够解决很多的子问题(例如从别的起点到终点有多少种),也就是说每个节点的结果只需要依赖前一个或几个节点的结果即可

动态规划 vs 回溯 vs 贪心