通过组合子问题的解来来求解原问题的。
动态规划与分治方法类似。但又不同,分治方法的子问题是互不相交,而动态规划中的子问题是相交与子子问题。
动态规划方法一般用来求解最优化问题。
我们解决动态规划问题一般分为四步:
1、定义一个状态,这是一个最优解的结构特征
2、进行状态递推,得到递推公式
3、进行初始化
4、返回结果
动态规划有自底向上和自顶向下两种解决问题的方式。自顶向下即记忆化递归,自底向上就是递推。
求解动态规划的核心问题是穷举
例如:斐波那契数列、递归公式f(n)=f(n-1)+f(n-2)
1暴力递归
class Solution:
def fib(self, n: int) -> int:
if n<2:
return n
return self.fib(n-2)+self.fib(n-1)
2带备忘录的递归
class Solution:
dic={0:0,1:1}
def fib(self, n: int) -> int:
if n<2:
return n
self.dic.setdefault(n,self.fib(n-2)+self.fib(n-1))
return self.dic[n]
3dp表递推自顶向下
class Solution:
def fib(self, n: int) -> int:
dp = {0:0, 1:1}
for i in range(2, n+1):
self.dp[i] = self.dp[i-1] + self.dp[i-2]
return self.dp[n]
4dp表优化减少dp表容量
class Solution:
def fib(self, n: int) -> int:
if n<2:
return n
FUP=0
FDOWN=1
zhong={1:0}##中间态
for _ in range(2,n+1):
zhong[1]=FDOWN
FDOWN=FUP+FDOWN
FUP=zhong[1]
return FDOWN