在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

如输入这样的一个二维数组,
[
[1,3,1],
[1,5,1],
[4,2,1]
]

那么路径 1→3→5→2→1 可以拿到最多价值的礼物,价值为12

dp[i][j]表示走到i,j的最大价值,dp[i][j]=max(dp[i-1][j]+grid[i][j],dp[i][j-1]+grid[i][j]);

初始化:dp[0][i]=sum(grid[0][0~i]) dp[i][0]=sum(grid[0~i][0])

代码:

int dp[201][201];
    int maxValue(vector<vector<int> >& grid) {
        memset(dp,0,sizeof(dp));
        int sum1=0;
        int sum2=0;
        for(int i=1;i<=grid[0].size();i++){
           sum1+=grid[0][i-1];
           dp[1][i]=sum1;
        }
        for(int i=1;i<=grid.size();i++){
            sum2+=grid[i-1][0];
            dp[i][1]=sum2;
        }
        for(int i=2;i<=grid.size();i++){
           for(int j=2;j<=grid[0].size();j++){
               dp[i][j]=max(dp[i-1][j]+grid[i-1][j-1],dp[i][j-1]+grid[i-1][j-1]);
           }
        }
        return dp[grid.size()][grid[0].size()];
    }
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.