题链接:https://leetcode-cn.com/problems/li-wu-de-zui-da-jie-zhi-lcof/
题描述:
解题思路:
每个单元格只能由另一个单元格向右走或者向下走到达,设 f(i, j) 为从棋盘左上角走到当前单元格的累计最大礼物价值。
所以 f(i, j) 为 f(i-1, j) 和 f(i, j-1) 中的较大值加上当前单元格的礼物价值 grid[i][j]。
对于边界:
(1)当 i==0 且 j ==0 时,f(i, j) = grid[i][j]。
(2)当 i==0 且 j !=0 时,f(i, j) = f(i, j-1) + grid[i][j]。
(3)当 j==0 且 i !=0 时,f(i, j) = f(i-1, j) + grid[i][j[。
(4)当 j !=0 且 i != 0 时,f(i,j) = max(f(i, j-1), f(i-1, j)) + grid[i][j]。
我们可以直接在原数组上进行 f(i, j) 的求值。
代码实现:
/**
* @param {number[][]} grid
* @return {number}
*/
var maxValue = function(grid) {
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid[0].length; j++) {
if (i == 0 && j == 0) {
grid[i][j] = grid[i][j];
} else if (i == 0) {
grid[i][j] = grid[i][j - 1] + grid[i][j];
} else if (j == 0) {
grid[i][j] = grid[i - 1][j] + grid[i][j];
} else {
grid[i][j] = Math.max(grid[i - 1][j], grid[i][j - 1]) + grid[i][j];
}
}
}
return grid[grid.length - 1][grid[0].length - 1];
};
时间复杂度:O(MN)(棋盘为 M*N)
空间复杂度:O(1)