一、动态规划算法
概念:动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。
算法关键点:
1、最优化原理,也就是最有子结构性质。这指的是一个最优化策略具有这样的性质,无论过去状态和决策如何,对前面的决策所形成的状态而言,余下的决策必须构成最优策略,简单来说就是一个最优化策略的子策略总是最优的,如果一个问题满足最优化原理,就称其有最优子结构性质。
2、无后效性,指的是某个状态下的决策的收益,只与状态和决策相关,与达到该状态的方式无关。
3、子问题的重叠性,动态规划将原来指数级的暴力搜索算法改进到了具有多项式时间复杂度的算法,其中的关键在于解决了荣誉,重复计算的问题,这是动态规划算法的根本目的。
4、总体来说,动态规划算法就是一系列以空间换取时间的算法。
典型示例:
例1:一组二维数组[[10,3,1,13],[8,11,3,4],[5,0,2,1],[1,8,4,0]],从坐标0,0开始移动,每次只能向下或者向右移动一格,最优路径是经过路径的所有数组值之和,最小即为最优路径,求最优路径大小。
a = [[10,3,1,13],[8,11,3,4],[5,0,2,1],[1,8,4,0]] #一组二重数组 b = [[0,0,0,0]]*4 #用来装路径值结果 print(a) print(b) for i in range(4): for j in range(4): if i==0 and j==0 : b[i][i] = a[i][j] elif i==0 and j!=0: b[i][j] = a[i][j] +b[i][j-1] elif i!=0 and j==0: b[i][j] = a [i][j] + b[i-1][j] else: b[i][j] = a[i][j] +min(b[i][j-1],b[i-1][j]) print("最优路径:%d" %b[3][3])
例2:有n级台阶,现在从第一级开始爬,一次可以爬一级,也可以一次爬2级,请问爬到第n级一共有多少种方法?
分析:当台阶只有1级,有1种;2级,有2种;3级,有3种,,,当要爬到n级的时候,此时有2种情况,一种是跨1级,另一种是跨2级才能到第n级。到达n级的情况则是这两种之和,依次往前推,则有公式f(n) = f(n-1) +f(n-2)
a = [0] * 10
def fun(self,scale):
if scale ==1 or scale==2:
return scale
if a[scale-1] ==0:
a[scale-1] = self.fun(scale-1)
if a[scale-2] == 0:
a[scale - 2] = self.fun(scale-2)
return a[scale - 1] + a[scale - 2]
未完。。。