动态规划
这是我参与更文挑战的第22天,活动详情查看: 更文挑战
动态规划的定义
动态规划问题一直是面试时最频繁出现的算法题,主要原因在于此类问题灵活度高,思维难度大,没有很明显的套路做法。
我们先来了解一下什么是动态规范。
动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,从而创立了动态规划。
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题的解不会被重复调用。
动态规划的解题步骤
-
状态是什么
-
状态转移方程是什么
-
状态的初始值是什么
-
问题要求的最后答案是什么
下面我们用面试经常考的青蛙跳台阶的题目来了解一下动态规划
代码实现青蛙跳台阶
// 青蛙跳台阶
// 这只青蛙,一次可以跳1级台阶、2级台阶、或n级台阶。
// 问:这只青蛙,跳上n级台阶有多少种方法?
// f(n) = f(n-1) + f(n-2) + f(n-3) + …… + f(2) + f(1) + f(0) 关系数组元素间的关系式
function jump(n) {
if (n <= 0) return -1;
if (n == 1) return 1;//初始值
if (n == 2) return 2;//初始值
var result = 0;
for (var i = 1 ; i < n ; i ++) {
result += jump(n - i);
}
return result + 1;// +1代表从0级台阶直接跳上去的情况
}
/*
* 1,1,1,1,
* 1,1,2
* 1,2,1,
* 2,1,1,
* 1,3,
* 3,1,
* 2,2,
* 4
* */
console.log(jump(4));