[剑指 Offer 47. 礼物的最大价值](leetcode-cn.com/problems/li…
经典动态规划题目
代码实现如下,解题思路是,dp[i][j] 代表第i行,第j列,对应的最大价值,这时候需要建立一个模型,最小从dp[0][0]开始,最大求值为dp[m][n] 初始化第一行,第一列的目的就是为了后续遍历,起到了初始值的作用,循环时候,环环相扣
有m行 其实就是一维数组所对应的长度
有n列 其实就是一维数组中任何一个子项数组 的长度
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];
};