[leetCode]剑指 Offer 47. 礼物的最大价值
解法 动态规化
先递归分析问题,定义函数
f
(
i
,
j
)
f(i,j)
f(i,j)表示到达坐标(i, j)盒子时拿到礼物的总和的最大值。有两种途径到达坐标(i,j):通过上方盒子(i-1, j);通过左方盒子(i,j-1)。所以
f
(
i
,
j
)
=
m
a
x
(
f
(
i
−
1
,
j
)
,
f
(
i
,
j
−
1
)
)
+
g
i
f
t
(
i
,
j
)
f(i,j)=max(f(i-1,j),f(i,j-1))+gift(i,j)
f(i,j)=max(f(i−1,j),f(i,j−1))+gift(i,j) ,
g
i
f
t
(
i
,
j
)
gift(i,j)
gift(i,j)代表(i,j)位置礼物的价值。
为了避免重复计算采用循环解法。定义一个辅助二维数组,数组中坐标(i, j)元素代表到达坐标(i,j)时礼物的价值总和的最大值。
class Solution {
public int maxValue(int[][] grid) {
if(grid == null || grid.length == 0 || grid[0].length == 0)
return 0;
// 棋盘的行数与列数
int rows = grid.length;
int cols = grid[0].length;
// 创建一个二维数组存放f(i,j),f(i,j)代表拿到第[i,j]个礼物时的礼物价值
for(int i = 0; i < rows; ++i) {
for(int j = 0; j < cols; ++j) {
int up = 0;
int left = 0;
if(i > 0)
up = grid[i-1][j];
if(j > 0)
left = grid[i][j-1];
grid[i][j] = Math.max(up, left) + grid[i][j];
}
}
return grid[rows-1][cols-1];
}
}