什么是动态规划?
动态规划的基本思想是将原问题划分为若干个相互重叠的子问题,并通过求解子问题的最优解来求解原问题的最优解。动态规划的关键是确定问题的状态和状态转移方程。
这是网上给官话,哔哔一堆没吊用。下面直接上代码。
例子🌰
斐波那契数列
这是一组斐波那契数列0, 1, 1, 2, 3, 5, 8, ...
他的第一位和第二位上由0和1组成,后续的每一位都是前两位的和。写出一个函数求第n位是几?
普通解法
function fibo(n){
if(n < 0){
return -1;
}
if (n === 0) {
return 0;
}
if (n === 1) {
return 1;
}
let pre1 = 1;
let pre2 = 0;
for(let i = 2; i < n; i ++) {
let _ = pre1 + pre2;
pre2 = pre1;
pre1 = _;
}
return pre1 + pre2;
}
这种解法完全可以算出结果,但不是最好的方式。我们思考下会发现
f(n) = f(n-1) + fn(n+2)
这样的公式。根据这个公式重新写
function fibo2(n){
if(n < 0){
return -1;
}
if (n === 0) {
return 0;
}
if (n === 1) {
return 1;
}
return fibo2(n - 1) + fibo2(n - 2);
}