题目:
在一个 m*n 的棋盘中的每一个格都放一个礼物,每个礼物都有一定的价值(价值大于0).你可以从棋盘的左上角开始拿各种里的礼物,并每次向右或者向下移动一格,直到到达棋盘的右下角。给定一个棋盘及上面个的礼物,请计算你最多能拿走多少价值的礼物?
思路:
我们利用递归的思路来分析。定义函数f(i,j)表示到达坐标为(i,j)的格子时能拿到的礼物总和的最大值。根据题目要求,我们要么从(i-1,j),要么从(i,j-1)到达(i,j)。因此f(i,j) = max( f( i-1 , j ) , f( i , j-1 ))。由于进行递归会有大量重复计算,因此选择基于循环,并使用辅助数组。
public class Solution {
public static int getMostValue(int[][] array)
{
if (array==null||array.length==0||array[0].length==0)
return -1;
int rows = array.length;
int cols = array[0].length;
int[][] MaxValue = new int[rows][cols];
for (int i = 0; i <rows ; i++) {
for (int j = 0; j <cols ; j++) {
int up = 0;
int left = 0;
if (i>0)
up = MaxValue[i-1][j];
if (j>0)
left = MaxValue[i][j-1];
MaxValue[i][j] = array[i][j]+Math.max(up,left);
}
}
return MaxValue[rows-1][cols-1];
}
}