礼物的最大价值
在一个m*n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?
示例:
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
按照题目所走路线为1-4-7-8-9.最多拿29的礼物
分析:1.将它从最左上角开始移动算起,2.先要得到它的向右一格和向下一格的礼物值,3.选择较大的,然后走到最右下角,4.然后将他所走过的格子里面代表礼物的数值相加(这一步可在第二部步中初始相加)得到礼物最大值
这里还可以理解为最右下角的值选择它相邻的左边值和上边值,看那个大选择哪个
我们用2*2棋盘可以清楚发现
甲 | 乙 |
丙 | 丁 |
由甲到丁,中间隔着丙、乙,现在就判断丙、乙哪个大,就选择那条路走(时刻记着向下或者向右走的规则)
算法代码演示
public class solution3 {
public static void main(String[] args) {
int[][] grid=new int[][]{{1,2,3},{4,5,6},{7,8,9}};
System.out.println("礼物的最大值:"+getMaxValue(grid));
}
private static int getMaxValue(int[][] grid) {
//代表礼物这个二维数组的行数
int m = grid.length;
//代表礼物这个二维数组的0行所代表的长度,相当于列数
int n = grid[0].length;
//如果礼物为空或者该数组行数为0或者0行所代表的长度为0,则返回0,即礼物价值为0
if(grid == null || m == 0 || n == 0)
return 0;
//初始这张棋盘
int[][] chessboard = new int[m][n];
//该棋盘的第一个数与礼物的第一个数相对应
chessboard[0][0] = grid[0][0];
//第一列只能从上面下来,这里相当于选择向下走时,下面的数和上面的数相加
for(int i = 1;i < m;i++)
chessboard[i][0] = chessboard[i - 1][0] + grid[i][0];
//第一行只能从左边过来 这里相当于选择向左走时,左边的数与右边的数相加
for(int j = 1; j < n;j++)
chessboard[0][j] = chessboard[0][j - 1] + grid[0][j];
//这里是最后一步即最右下角选择和它相邻的左边的数相加还是和它相邻的上边的数相加
//这里引入了一个Math.max() 函数返回作为输入参数的最大数字,如果没有参数,则返回 -Infinity。
for(int i = 1;i < m;i++){
for(int j = 1;j < n;j++){
chessboard[i][j] = Math.max(chessboard[i - 1][j],chessboard[i][j - 1]) + grid[i][j];
}
}
return chessboard[m - 1][n - 1];
}
}
总结
二维数组还可以自定义,不用我这样使用明确的数字,如果代码存在问题即结果不正确,希望您能指出来