class Solution:
def maxValue(self, grid: List[List[int]]) -> int:
m, n = len(grid), len(grid[0])
dp = [0] * n
dp[0] = grid[0][0]
for i in range(1, n):
dp[i] = dp[i - 1] + grid[0][i]
for i in range(1, m):
dp[0] += grid[i][0]
for j in range(1, n):
dp[j] = max(dp[j], dp[j - 1]) + grid[i][j]
return dp[n - 1]
class Solution {
public int maxValue(int[][] grid) {
int m = grid.length, n = grid[0].length;
for (int i = 1; i < m; i++) {
grid[i][0] += grid[i - 1][0];
}
for (int i = 1; i < n; i++) {
grid[0][i] += grid[0][i - 1];
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
grid[i][j] += Math.max(grid[i-1][j], grid[i][j-1]);
}
}
return grid[m - 1][n - 1];
}
}
共以下 14 个回答
class Solution {
public int jewelleryValue(int[][] frame) {
int[][] dp = new int[frame.length][frame[0].length];
dp[0][0] = frame[0][0];
for(int i =1;i<frame.length;i++){
dp[i][0] = dp[i-1][0]+frame[i][0];
}
for(int i =1;i<frame[0].length;i++){
dp[0][i] = dp[0][i-1]+frame[0][i];
}
for(int i =1;i<frame.length;i++){
for(int j =1;j<frame[0].length;j++){
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1])+frame[i][j];
}
}
return dp[frame.length-1][frame[0].length-1];
}
}
简单动态规划
“`java
class Solution {
public int jewelleryValue(int[][] frame) {
//dp[i][j]表示到达i,j位置,路线的最大值,则dp[i][j] = Math.max(dp[i – 1][j], dp[i][j -1]) + frame[i][j];
//因为路径上没有负数,所以dp[m-1][n-1]就是最大值
int m = frame.length;
int n = frame[0].length;
//优化成一维数组
int[] dp = new int[n];
dp[0] = frame[0][0];
for (int j = 1; j < n; j++) { dp[j] = dp[j - 1] + frame[0][j]; } for (int i = 1; i < m; i++) { for(int j = 0; j < n; j++) { dp[j] = Math.max(j > 0 ? dp[j – 1] : 0, dp[j]) + frame[i][j];
}
}
return dp[n – 1];
}
}
时间复杂度:O(mn)
空间复杂度:O(n)
使用滚动数组
MY【思路】DP
【复杂度】时间O(mn),空间O(m)/O(n)
动态规划
时间:O(mn)
空间:O(1),不考虑grid
思路:动态规划——因为是向下或向右移动,因此将上侧和左侧的边界dp数组赋予初值,然后根据向下或向右的值进行状态转移
时间复杂度:O(mn) 空间复杂度:O(mn)
“`C++>& grid) {
int maxValue(vector
int m = grid.size();
int n = grid[0].size();
}
“`
c++实现>& grid) {
int maxValue(vector<vector
int line = grid[0].size();
int row = grid.size();
int dp[row][line];
dp[0][0] = grid[0][0];
for(int i = 1;i<row;i++)
{
dp[i][0] = grid[i][0]+dp[i-1][0];
}
for(int i = 1;i<line;i++)
{
dp[0][i] = grid[0][i]+dp[0][i-1];
}
for(int i = 1;i<row;i++)
{
for(int j = 1;j<line;j++)
{
dp[i][j] = max(dp[i-1][j],dp[i][j-1])+grid[i][j];
}
}
return dp[row-1][line-1];
}
时间复杂度O(mn)