-
题目描述
在一个m*n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或向下移动一格,直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?
-
思路
动态规划。设函数f(i,j)表示到达坐标(i,j)的格子时能拿到的礼物总和的最大值,那么到达(i,j)只能通过格子(i-1,j)或者(i,j-1)。所以f(i,j)=max{f(i-1,j),f(i,j-1)}+gift[i,j],其中gift[I,j]表示坐标为(i,j)的格子里礼物的价值。
-
C++实现
int getMaxValue(vector<vector<int> > values){
int rows = values.size();
int cols = values[0].size();
if(rows==0||cols==0)return 0;
vector<vector<int>> maxValues(rows,vector<int>(cols));
for(int row=0;row<rows;row++){
for(int col=0;col<cols;col++){
int left = 0;
int up = 0;
if(row>0)
up = maxValues[row-1][col];
if(col>0)
left = maxValues[row][col-1];
maxValues[row][col]=max(left,up)+values[row][col];
}
}
int maxValue = maxValues[rows-1][cols-1];
return maxValue;
}