剑指 Offer 47. 礼物的最大价值

118 阅读1分钟

[剑指 Offer 47. 礼物的最大价值](leetcode-cn.com/problems/li…

经典动态规划题目

代码实现如下,解题思路是,dp[i][j] 代表第i行,第j列,对应的最大价值,这时候需要建立一个模型,最小从dp[0][0]开始,最大求值为dp[m][n] 初始化第一行,第一列的目的就是为了后续遍历,起到了初始值的作用,循环时候,环环相扣

有m行 其实就是一维数组所对应的长度

有n列 其实就是一维数组中任何一个子项数组 的长度

image.png

const maxValue = dArr => {  
  const [m, n] = [dArr.length, dArr[0].length];
  // 创建  m行 n列 的二维数组
  const dp = new Array(m).fill(0).map(() => new Array(n).fill(0));
  // 初始化第一行 第一列
  dp[0][0] = dArr[0][0];
  // 补充第一列初始化
  for (let i = 1; i < m; i++) {
      dp[i][0] = dp[i - 1][0] + dArr[i][0];
  }
  // 补充第一行初始化
  for (let j = 1; j < n; j++) {
      dp[0][j] = dp[0][j - 1] + dArr[0][j];
  }
  // 遍历,完善dp数组
  for (let i = 1; i < m; i++) {
      for (let j = 1; j < n; j++) {
          dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + dArr[i][j];
      }
  }
  return dp[m - 1][n - 1];
};