礼物的最大价值:最直观的想法是,使用二维数组dp[i][j]表示第i行第j列所能拿的礼物的最大价值,首先初始化第一行和第一列,其是当前行(列)前一个最大价值与当前元素之和,接着从左向右从上向下遍历,其中dp[i][j]=max(dp[i-1][j],dp[i][j-1])+grid[i][j],最后返回dp[m-1][n-1]即可。

int maxValue(vector<vector<int> >& grid) 
{
   //m表示长 n表示宽
   int m=grid.size(),n=grid[0].size();
   //dp[i][j]表示第i行第j列的所能拿的礼物的最大价值
   vector<vector<int>> dp(m,vector<int>(n,0));
   //初始化第一个
   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]=max(dp[i-1][j],dp[i][j-1])+grid[i][j];
   return dp[m-1][n-1];
}