当前位置:首页 > 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])。

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])。

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,求最大价值。

js实现动态规划

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实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…

elementui动态

elementui动态

ElementUI 动态组件与数据绑定 ElementUI 支持动态渲染组件和数据绑定,常用于表格、表单等场景的动态生成。通过 v-for 和动态属性绑定实现组件灵活配置。 动态生成表格列 <…

vue实现动态隐藏

vue实现动态隐藏

Vue 实现动态隐藏的方法 在 Vue 中实现动态隐藏可以通过多种方式实现,以下是一些常见的方法: 使用 v-if 指令 v-if 指令根据表达式的真假值来条件性地渲染元素。当表达式为 false…