题目:在一个mXn的棋盘的每一格放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或者向下移动一格,直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?
1 10 3 8
12 2 9 6
5 7 4 11
3 7 16 5
可以看到,价值最大的就是,1->12->5->7->7->16->5。即标下划线的数字。
那么现在,最好的方法就是动态规划了。这就是一道非常简单的动态规划。
首先用一个二维数组,保存每一步的值,然后不停的循环。动态方程:f(i,j) = Max(f(i-1,j),f(i,j-1))+gift(i,j)
当然,还有优化的方法,但现在先给出最简单的。看代码吧。
package com.algorithm04; public class Algorithm47 { public int MaxMartix(int[][] matrix){ int row,col; //行数 row = matrix.length; //列数 col = matrix[0].length; int MaxValue[][] = new int[row][col]; for(int i = 0 ; i < row ; i++) for(int j = 0 ; j < col ;j++) { int left,up; left = up = 0; //当前位置的左边和上边的最大值 int maxvalue; if(i>0) { //求i,j上边的值 up = MaxValue[i-1][j]; } if(j>0) { //求i,j左边的值 left = MaxValue[i][j-1]; } //取出最大值 maxvalue = max(left,up); //最大值加上当前位置的值 MaxValue[i][j] = maxvalue + matrix[i][j]; } return MaxValue[row-1][col-1]; } //返回i,j中的最大值 private int max(int i, int j){ return i>j?i:j; } public static void main(String[] args) { int[][] matrix = new int[][]{{1,10,3,8},{12,2,9,6},{5,7,4,11},{3,7,16,5}}; Algorithm47 algorithm47 = new Algorithm47(); int max = algorithm47.MaxMartix(matrix); System.err.println(max); } }