动态规划(dynamic programing)
- 运筹学的一个分支。是求解决策过程(decision process)最优的数学方法;
- 基于一个
递推公式
以及一个或多个初始状态
- 当前子问题的解由上一个子问题的解推出。
典型的爬楼梯问题
有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。求出一共有多少种走法。
talk is cheap show me the code
- 解1:递归求解
function getWays($n) { if ($n < 1) return 0; if ($n == 1) return 1; if ($n == 2) return 2; return getWays($n-1) + getWays($n-2); }
- 解2:备忘录法(将重复计算的值记录下来)
function getWays($n,$a=array()) { if ($n < 1) return 0; if ($n == 1) return 1; if ($n == 2) return 2; if (isset($a[$n])) return $a[$n]; return $a[$n] = getWays($n-1) + getWays($n-2); }
- 解3:动态规划求解
(从i=3开始迭代,a保存倒数第二个数据,b保存倒数第一个数据,tmp保存当前数据)function getWays($n) { $a=1;$b=2;$tmp=0; for ($i=3;$i<=$n;$i++){ $tmp = $a + $b; $a = $b; $b = $tmp; } return $tmp; }