在 一 个 m*n 的 棋 盘 的 每 一 格 都 放 有 一 个 礼 物 , 每 个 礼 物 都 有 一 定 的 价 值 ( 价 值 大 于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到 到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值 的礼物?
输入: [ [ 1, 3, 1 ] , [ 1 ,5, 1 ] , [ 4 ,2, 1] ]
输出: 1 2
解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物
解题思路
1.来到 arr[ii],[j] 时, 由于只能题目中只能向下或者向右走,所以当来到 arr[i][j]时,一定是从arr[i][j-1] (从左边走来的)或者arr[i-1][j](从上边走来的)这两种情况
2.可以通过比较 从左边走来的这个值和 从右边走过来的值 判断那个比较大。
3.如果左边的值比较大就将左边的值放入到数组中,如果右边的值比较大,就把右边的值放入到新数组中。
4.最后遍历新的数组输出最大值
5. 考虑特殊情况 如果我只有一行 或者一列
6.直接进行循环来遍历数组将其相加
package com.atguigu.lianxi.suanfa; import java.util.Arrays; /** * 在 一 个 m*n 的 棋 盘 的 每 一 格 都 放 有 一 个 礼 物 , 每 个 礼 物 都 有 一 定 的 价 值 ( 价 值 大 于 * 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到 * 到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值 * 的礼物? * */ public class Test01 { public static void main(String[] args) { int[][] arr = { {1, 2, 5} }; /* int[][] arr = { {2,1,3} };*/ /* int[][] arr = { {2}, {1}, {2} }; */ System.out.println(maxValue(arr)); } /** * 求取最大值 * * @param arr * @return */ public static int maxValue(int[][] arr) { if (arr.length == 0 || arr == null) return 0; int m = arr.length; int n = arr[0].length; int[][] maxValue = new int[m][n]; // 首先我们需要一个二维数组 // 通过动态规划的手段 maxValue[0][0] = arr[0][0]; // 考虑特殊情况 //初始化dp的最左边一列,从上到下累加 for (int i = 1; i < m; i++) { maxValue[i][0] = maxValue[i-1][0] + arr[i][0]; } // 行 从左往右走 for (int i = 1; i < n; i++) { maxValue[0][i] = maxValue[0][i-1] + arr[0][i]; } for (int i = 1; i < m ; i++) { for (int j = 1; j < n; j++) { // 因为 maxValue数组中存的永远都是我当前路线的最大值,所以可以直接加就行了 maxValue[i][j] = Math.max(maxValue[i -1][j], maxValue[i][j - 1]) + arr[i][j]; } } return maxValue[m-1][n-1]; } }
5504

被折叠的 条评论
为什么被折叠?



