当前位置:首页 > JavaScript

js实现动态规划

2026-03-15 22:58:21JavaScript

动态规划基础概念

动态规划(Dynamic Programming, DP)是一种通过将问题分解为子问题并存储子问题解来优化递归计算的算法思想。适用于具有重叠子问题和最优子结构性质的问题,如背包问题、最长公共子序列等。

动态规划实现步骤

问题分析 明确问题的状态定义、状态转移方程和边界条件。例如,斐波那契数列中状态定义为 dp[i] 表示第 i 项的值,状态转移方程为 dp[i] = dp[i-1] + dp[i-2]

初始化DP表 根据问题规模创建数组或矩阵存储子问题解。通常需要初始化基础情况(如 dp[0]dp[1])。

js实现动态规划

const dp = new Array(n + 1).fill(0);
dp[0] = 0;
dp[1] = 1;

状态转移 通过循环填充DP表,根据状态转移方程计算后续状态。

for (let i = 2; i <= n; i++) {
  dp[i] = dp[i - 1] + dp[i - 2];
}

返回结果 最终解通常存储在DP表的特定位置(如 dp[n])。

js实现动态规划

return dp[n];

经典问题示例:斐波那契数列

function fibonacci(n) {
  if (n <= 1) return n;
  const dp = new Array(n + 1).fill(0);
  dp[0] = 0;
  dp[1] = 1;
  for (let i = 2; i <= n; i++) {
    dp[i] = dp[i - 1] + dp[i - 2];
  }
  return dp[n];
}

优化空间复杂度

若当前状态仅依赖有限的前置状态,可压缩DP表至常数空间。例如斐波那契数列只需保存前两项:

function fibonacciOptimized(n) {
  if (n <= 1) return n;
  let prev = 0, curr = 1;
  for (let i = 2; i <= n; i++) {
    const next = prev + curr;
    prev = curr;
    curr = next;
  }
  return curr;
}

复杂案例:0-1背包问题

给定物品重量 weights 和价值 values,背包容量 capacity,求最大价值。

function knapsack(weights, values, capacity) {
  const n = weights.length;
  const dp = Array.from({ length: n + 1 }, () => Array(capacity + 1).fill(0));

  for (let i = 1; i <= n; i++) {
    for (let w = 1; w <= capacity; w++) {
      if (weights[i - 1] <= w) {
        dp[i][w] = Math.max(
          dp[i - 1][w],
          values[i - 1] + dp[i - 1][w - weights[i - 1]]
        );
      } else {
        dp[i][w] = dp[i - 1][w];
      }
    }
  }
  return dp[n][capacity];
}

注意事项

  • 状态设计:根据问题特点选择一维或二维DP表。
  • 边界处理:确保初始状态和越界情况被正确处理。
  • 性能权衡:空间优化可能增加代码复杂度,需根据场景选择。

标签: 动态js
分享给朋友:

相关文章

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

js实现轮播图

js实现轮播图

轮播图实现方法 基础HTML结构 <div class="slider"> <div class="slides"> <img src="image1.jpg…

vue动态组件实现

vue动态组件实现

Vue 动态组件实现方法 使用 component 标签与 is 属性 通过 Vue 内置的 <component> 标签和 is 属性实现动态组件切换。is 的值可以是已注册的组件名或导…

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Pro…

vue实现动态显示页面

vue实现动态显示页面

动态显示页面的实现方法 在Vue中实现动态显示页面通常涉及数据绑定、条件渲染、列表渲染以及动态组件等技术。以下是几种常见的实现方式: 数据驱动视图 Vue的核心思想是数据驱动视图,通过修改数据自动更…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…