动态规划算法,主要是指求解最优解时用的一种算法。
在背包问题,最短路径问题,资源分配问题上有良好的应用效果。
使用动态规划的前提条件是:满足 最优化原理和 无后效性
最优化原理:
一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。
无后效性
将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后效性。
动态规划主要解决子问题的重叠性
动态规划算法的关键在于解决冗余,这是动态规划算法的根本目的。动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以空间复杂度会增加。
解决动态规划问题的思路:
找到最优子结构,写出状态转移方程。
以Fibonacci数列为例:
最优子结构即为:当前值 = 前两项之和。
def F(n):
# 初始化列表
A = [0]*n
A[1] = 1
# 构建dp方程
for i in range(2,n):
A[i] = A[i-1] + A[i-2]
print(A)
F(10)
#output
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]