女朋友问什么是动态规划,应该怎么回答?
前言
-
最优子结构
-
边界
-
状态转移公式
“You know, I couldn’t do it. I couldn’t reduce it to the freshman level. That means we really don’t understand it.” –费曼
吃珍珠
问题:如果一杯奶茶有10颗珍珠,每吸一次只能吸一颗或者两颗。那么一共有多少种吸法?”
如果每次吸一颗,那就是1+1+1+1+1+1+1+1+1+1=10
如果每次吸两颗:2+2+2+2+2=10
f(9)=f(8)+f(7), f(8)=f(7)+f(6)
f(1) = 1;
f(2) = 2;
f(n) = f(n-1) + f(n-2); n>2
对程序员来说
function getClimbingWay(n) { if (n<1) return 0; if (n === 1) return 1; if (n === 2) return 2; return getClimbingWay(n-1) + getClimbingWay(n-2) } // 时间复杂度为:O(2**N)
因为从公式可以得出f(3) = f(2) + f(1), f(4) = f(3) + f(2)。所以在每次迭代中只要保留之前的两个状态即可,就可以推导最新的状态。
function getClimbingWay(n, map) { if (n<1) return 0; if (n === 1) return 1; if (n === 2) return 2; let pre = 1, pre2 = 2, res = 0 for (let i=3; i<=n; i++) { res = pre + pre2; pre = pre2; pre2 = temp; } return temp } // 程序从i=3开始迭代,一直到i=n结束。每一次迭代,都会计算出多一级台阶的走法数量。迭代过程中只需保留两个临时变量a和b,分别代表了上一次和上上次迭代的结果。
作者:zhangwinwin
链接:女朋友问什么是动态规划,应该怎么回答?
来源:github