动态规划
动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决
基本思路
动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。
算法实现
使用动态规划求解问题,最重要的就是确定动态规划三要素:
(1)问题的阶段-----问题的边界
(2)每个阶段的状态-----最优子结构
(3)从前一个阶段转化到后一个阶段之间的递推关系------转态转移公式
实例分析
实例1 爬楼梯
- 问题描述
有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法
- 问题分析
状态方程:F(1)=1,F(2)=2,F(n)=F(n-1)+F(n-2)(n>3) - 代码实现
class Solution:
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
# 递归 time limit
# if n==1 or n==2:
# return n
# return Solution.climbStairs(self,n-1)+Solution.climbStairs(self,n-2)
## 备忘录算法 time limit
# data={}
# if n==1 or n==2:
# return n
# if n in data:
# return data['n']
# else:
# value=Solution.climbStairs(self,n-1)+Solution.climbStairs(self,n-2)
# data['n']=value
# return value
## 动态规划
if n==1 or n==2:
return n
first=1
second=2
temp=0
for i in range(n-2):
temp=first+second
first=second
second=temp
return temp