思路(动态规划法)
状态定义:dp[i][j]代表从棋盘左上角开始到grid[i][j]能拿到的价值数
转移方程:dp[i][j]=max(dp[i-1][j],dp[i][j-1])+grid[i][j]
初始化:
dp[0][0] = grid[0][0]。
第一行就是一直向右走,累加起来的价值。
第一列就是一直向下走,累加起来的价值。
返回值:dp[m-1][n-1]
代码
/**
* @param {number[][]} grid
* @return {number}
*/
var maxValue = function(grid) {
var m = grid.length;
var n = grid[0].length;
var dp = new Array(m);//dp[i][j]代表从棋盘左上角开始到grid[i][j]能拿到的价值数
for(let i = 0; i < m; i++) {
dp[i] = new Array(n);
}
dp[0][0] = grid[0][0];//初始化dp[0][0]
for(let j = 1; j < n; j++) {//初始化第一行,第一行就是一直向右走,累加起来的价值
dp[0][j] = dp[0][j-1] + grid[0][j];
}
for(let i = 1; i < m; i++) {//初始化第一列,第一列就是一直向下走,累加起来的价值
dp[i][0] = dp[i-1][0] + grid[i][0];
}
for(let i = 1; i < m; i++) {
for(let j = 1; j < n; j++) {
if(dp[i-1][j] >= dp[i][j-1]) dp[i][j] = grid[i][j] + dp[i-1][j];//如果上方dp价值大于左方dp价值
else dp[i][j] = grid[i][j] + dp[i][j-1];//如果左方dp价值大于上方dp价值
}
}
return dp[m-1][n-1];
};