题目描述
在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。
你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格直到到达棋盘的右下角。
给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?
注意:
- m,n>0
样例
Input:[
[2,3,1],
[1,7,1],
[4,6,1]
]
Output:19
解题思路
-
描述
本题目是一道比较简单的动态规划问题。
对于动态规划问题主要考虑三个问题:
-
状态如何表示
f[i][j] 表示从棋盘左上角开始拿礼物直到(i,j)所获得的最大价值的礼物
-
状态转换
f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j ] , f [ i ] [ j − 1 ] ) + g r i d [ i ] [ j ] f[i][j] = max(f[i-1][j],f[i][j-1]) + grid[i][j] f[i][j]=max(f[i−1][j],f[i][j−1])+grid[i][j]
-
状态边界
当i=0或者j=0是,f[i][j] = 0
-
-
实现代码:
int getMaxValue(vector<vector<int>>& grid) { int m = grid.size(),n = grid[0].size(); vector<vector<int> > f(m +1,vector<int>(n+1,0)); for(int i = 1;i<=m;i++) { for(int j=1;j<=n;j++) { f[i][j] = max(f[i-1][j],f[i][j-1]) + grid[i-1][j-1]; } } return f[m][n]; }