动态规划的课堂学习笔记
(仅仅作于我的个人学习笔记嘻嘻)
来,开启神奇之旅!
题目:
问题建模
-
拆解
F(10)=F(9)+F(8)
F(9)=F(8)+F(7)
F(8)=F(7)+F(6)
…
F(3)=F(2)+F(1)
F(2)=2
F(1)=1 -
归纳
F(1) = 1;
F(2) = 2;
F(n) = F(n-1)+F(n-2)(n>=3) -
最优子结构
F(10)=F(9)+F(8)
因此,F(9)和F(8)为F(10)的最优子结构。 -
问题的边界
F(1),F(2)可直接得结果,无需简化。
如果一个问题没有边界,将永远无法得到有限的结果。 -
状态转移方程
F(n) = F(n-1)+F(n-2)(n>=3)
求解问题
-
递归求解
时间复杂度:O(2*n)
-
备忘录算法
时间、空间复杂度都为O(n),哈斯表暂存计算结果,用时直接运用。 -
动态规划求解
时间复杂度O(n),空间复杂度O(1),只运用了两/三个变量。
(以上两种方法皆为自顶向下,递归)
接下来(自底向上,迭代),类如:F(3)依赖于F(1),F(2)相加。
代码实现
程序从 i=3 开始迭代,一直到 i=n 结束。每一次迭代,都会计算出多一级台阶的走法数量。迭代过程中只需保留两个临时变量a和b,分别代表了上一次和上上次迭代的结果。 为了便于理解,我引入了temp变量。temp代表了当前迭代的结果值。