算法1
(动态规划) $O(n^2)$
dp[i][j] 代表走到(i,j)这个位置的最大价值
由于只能向下向右走,所以(i,j)这个位置只能从左边和上边过来,所以dp[i][j] = max(dp[i-1][j],dp[i][j-1]) + grid[i][j],即从左边和上边这两个位置选一个较大的加上本位置的价值,即可。
C++ 代码
class Solution {
public:
int getMaxValue(vector<vector<int>>& grid) {
if (grid.empty()) return 0;
int m = grid.size();
int n = grid[0].size();
int dp[m+1][n+1];
memset(dp,0,sizeof(dp));
dp[0][0] = grid[0][0];
for(int i=1;i<n;i++){
dp[0][i] = dp[0][i-1] + grid[0][i];
}
for(int i=1;i<m;i++){
dp[i][0] = dp[i-1][0] + grid[i][0];
}
for (int i=1;i<m;i++){
for(int j=1;j<n;j++){
dp[i][j] = (dp[i-1][j] > dp[i][j-1]?dp[i-1][j]:dp[i][j-1]) + grid[i][j];
}
}
// cout<<dp[1][0]<<dp[2][0];
return dp[m-1][n-1];
}
};
规避初始边界