研习算法第十二站-动态规划(javascript版)

157 阅读1分钟

动态规划

  • 动态规划是算法设计中的一种方法
  • 它将一个问题分解为相互重叠的子问题,通过反复求解子问题,来解决原问题

使用场景

斐波那契数列

image.png

  • 定义子问题: F(n) = F(N-1) + F(N-2)
  • 反复执行: 从 2 循环到 n ,执行上述公式

leetcode-cn.com 算法题实战

完整题目请打开 leetcode

70. 爬楼梯

image.png


/**
 * @param {number} n
 * @return {number}
 */
 // 数组存储 <= n 的数据
 var climbStairs = function(n) {
    if(n < 2) return 1;
    const dp = [1,1];
    for(let i = 2;i <= n; i++) {
        dp[i] = dp[i-1] + dp[i -2];
    }
    return dp[n];
};
// 优化 只保留 n 的数据
var climbStairs = function(n) {
    if(n < 2) return 1;
    let dp0 = 1;
    let dp1 = 1;
    for(let i = 2;i <= n; i++) {
        const temp = dp0;
        dp0 = dp1;
        dp1 = dp1 + temp
    }
    return dp1;
};

198. 打家劫舍

image.png

解题思路
  • f(k) = 从前k个房屋中能偷窃的最大数额
  • ak = 第k 个房屋的钱数
  • f(k) = max(f(k -2) + ak,f(k -1))
/**
 * @param {number[]} nums
 * @return {number}
 */
var rob = function(nums) {
    if(nums.length === 0) { return 0}
    const dp = [0, nums[0]];
    for(let i = 2; i <= nums.length; i++) {
        dp[i] = Math.max(dp[i -2] + nums[i-1], dp[i - 1])
    }
    return dp[nums.length];
};
// 优化版 只存储 最后一次的数据
var rob = function (nums) {
  if (nums.length === 0) {
    return 0;
  }
  let dp0 = 0;
  let dp1 = nums[0];
  for (let i = 2; i <= nums.length; i++) {
    const dp2 = Math.max(dp0 + nums[i - 1], dp1);
    dp0 = dp1;
    dp1 = dp2;
  }
  return dp1;
};

下一站 贪心算法