标签:动态 阶段 一个 code 通过 划算 初始 就是 直接
动态规划算法将待求解问题拆分成一系列相互交叠的子问题,通过递推关系定义各子问题的求解策略,并随时记录子问题的解,最终获得原始问题的解,避免了对交叠子问题的重复求解。
在动态规划算法中有三要素:
现有一个10层台阶的楼梯,每次可以选择一步走一级台阶或者一步走两级台阶,请计算共有多少种走法。
解题思路:
首先考虑最后一步的情况,要么是从第九级台阶再走一级到第十级,要么是从第八级台阶走两级到第十级,也就是说,要想到达第十级台阶,最后一步一定是从第八级或者第九级台阶开始的
如果已知从地面到第八级台阶一共有X种走法,从地面到第九级台阶一共有Y中走法,则从地面走到第十级台阶一定是X+Y
假设用F(n) 表示第n级台阶的走法数量,根据以上分析,可以得到 F(10) = F(9) +F(8),推广而知,
? F(n) = F(n-1) + F(n-2)
当问题细化,只有一级和两级台阶时,可以直接得出结论。
所以,该问题作为动态规划问题求解的三个要素就全部出现了
边界:F(1)=1, F(2)=2
最优子结构: F(n)的最优子结构为F(n-1)和F(n-2)
状态转移函数: F(n)=F(n-1)+F(n-2)
def upstairs(n):
# 初始化边界值
step1 = 1
step2 = 2
temp = 0
# 判断当前台阶级数是否小于1
if n < step1:
print(0)
# 判断当前台阶级数是否为1
if n == step1:
print(1)
# 判断当前台阶级数是否为2
if n == step2:
print(2)
# 迭代求解各级台阶的走法数量
for i in range(3, n):
temp = step1 + step2
step1 = step2
step2 = temp
print(temp)
n = 10
upstairs(10)
标签:动态 阶段 一个 code 通过 划算 初始 就是 直接
原文地址:https://www.cnblogs.com/JoshuaP/p/13179405.html