剑指 Offer 47. 礼物的最大价值 - 力扣(LeetCode) (leetcode-cn.com)
运行结果
思路
考察棋盘上任意一个不在边缘的位置(i, j),根据规则到达该位置只有两种方法:第一是从(i - 1, j)位置向下;第二是从(i, j - 1)位置向右。因此设sum[i][j]表示从左上角开始,到达(i, j)位置所能拿到礼物的最大价值,那么sum[i][j] = max(sum[i - 1][j], sum[i][j - 1]) + grid[i][j].
代码
class Solution {
public:
int maxValue(vector<vector<int>>& sum) {
int colSize = sum.size(), rowSize = sum[0].size();
//初始化边缘位置
for (int i = 1; i < colSize; ++i) sum[i][0] += sum[i - 1][0];
for (int i = 1; i < rowSize; ++i) sum[0][i] += sum[0][i - 1];
for (int i = 1; i < colSize; ++i) {
for (int j = 1; j < rowSize; ++j) {
sum[i][j] += sum[i - 1][j] > sum[i][j - 1] ? sum[i - 1][j] : sum[i][j - 1];
}
}
return sum[colSize - 1][rowSize - 1];
}
};