1.动态规划
设二维数组的行列为m,n,dp[i][j]保存到达i,j的最大价值,其值只来来源于上方和左方,即状态转移方程为:
dp[i][j]=max(dp[i-1][j],dp[i][j-1])+grid[i][j]
代码如下:
class Solution {
int imax=INT_MIN;
public:
int maxValue(vector<vector<int>>& grid) {
//动态规划 dp[i][j]表示到达I,j的最大价值
int m=grid.size();
int n=grid[0].size();
vector<vector<int>> dp(m,vector<int>(n,0));
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(i==0&&j==0)
dp[0][0]=grid[0][0];
else if(i==0)
dp[0][j]=dp[0][j-1]+grid[0][j];
else if(j==0)
dp[i][0]=dp[i-1][0]+grid[i][0];
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1])+grid[i][j];
imax=max(imax,dp[i][j]);
}
return imax;
}
};
时间复杂度O(m*n),空间复杂度O(m*n)
2.优化的动态规划
棋盘列数为n,设dp[n+1],dp[i]表示到达i的礼物最大价值,初始全为0
1 3 1 对应dp为0 1 4 5
1 5 1 对应dp为 0 2 9 10
4 2 1 对应dp为 0 6 11 12
状态转移方程为dp[i]=max(dp[j,dp[j-1])+grid[i-1][j-1]
代码如下:
class Solution {
public:
int maxValue(vector<vector<int>>& grid) {
//动态规划 dp[i][j]表示到达I,j的最大价值
int m=grid.size();
int n=grid[0].size();
vector<int> dp(n+1,0);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
dp[j]=max(dp[j],dp[j-1])+grid[i-1][j-1];
return dp[n];
}
};
时间复杂度O(m*n),空间复杂度O(n)
可以手动模拟一下实例的矩阵