动态规划

63 阅读1分钟

什么是动态规划?

动态规划的基本思想是将原问题划分为若干个相互重叠的子问题,并通过求解子问题的最优解来求解原问题的最优解。动态规划的关键是确定问题的状态和状态转移方程。

这是网上给官话,哔哔一堆没吊用。下面直接上代码。

例子🌰

斐波那契数列

这是一组斐波那契数列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);
}