描述:
有一张藏宝图,而藏宝图描述的所在区域(只有一个左上角入口和一个右下角出口)被分为m*n的小区域,并且每一个小区域内都藏有一定数量N(0<=N<=9)的宝贝,但要求只能从当前位置向右边或者下边寻找宝贝。如果你非常幸运,得到了这张藏宝图,请问你将如何规划寻宝路线,才能得到尽可能多的宝贝。
* 输入:
* 第一行为区域的行数m(1<=m<100)
* 第二行为区域的列数n(1<=n<=100)
* 输出:
* 第一行为得到的宝贝总数量
* 第二行为寻宝路线图–>[1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 5, 5, 6, 7, 8]表示:第一步:第一行,第一列 第二步:第一行,第二列 第三步:第二行,第二列 第四步:第二行,第三列,以此类推…
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
/**
*
* 描述:
* 有一张藏宝图,而藏宝图描述的所在区域(只有一个左上角入口和一个右下角出口)被分为m*n的小区域,并且每一个小区域内都藏有一定数量N(0<=N<=9)的宝贝,但要求只能从当前位置向
* 右边或者下边寻找宝贝。如果你非常幸运,得到了这张藏宝图,请问你将如何规划寻宝路线,才能得到尽可能多的宝贝。
* 输入:
* 第一行为区域的行数m(1<=m<100)
* 第二行为区域的列数n(1<=n<=100)
* 输出:
* 第一行为得到的宝贝总数量
* 第二行为寻宝路线图-->[1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 5, 5, 6, 7, 8]表示:第一步:第一行,第一列 第二步:第一行,第二列 第三步:第二行,第二列 第四步:第二行,第三列,以此类推...
* @author MLee
*
*/
public class MaxValue {
public static void main(String[] args) {
Random rand = new Random(System.currentTimeMillis());
Scanner sc = new Scanner(System.in);
int row = sc.nextInt();
int column = sc.nextInt();
int[][] matrix = new int[row][column];
for(int i = 0; i < matrix.length; i++){
for(int ii = 0; ii < matrix[i].length; ii++){
// matrix[i][ii] = rand.nextInt(11) + 10;
matrix[i][ii] = rand.nextInt(10);
}
}
for(int i = 0; i < matrix.length; i++){
System.out.println(Arrays.toString(matrix[i]));
}
System.out.println("**************************************");
System.out.println(Arrays.toString(getMaxValuePath(matrix, row, column)));
sc.close();
}
public static int[] getMaxValuePath(int[][] matrix, int row, int column){
int[][] dp = new int[row][column];
int pathLen = row+column-1;
int[] path = new int[pathLen]; // path[i] = rowNum(1<=rowNum<=row)表示第i+1步所在的行号,那么再根据path[i-1]的值就可判断出此时的位置了(path[0]为起始点)
for(int i = 0; i < matrix.length; i++){
for(int ii = 0; ii < matrix[i].length; ii++){
int up = 0, left = 0;
if((i - 1) >= 0){ // 当前行索引i有上一行
up = dp[i-1][ii];
}
if((ii - 1) >= 0){ // 当前列索引ii有前一列
left = dp[i][ii-1];
}
dp[i][ii] = matrix[i][ii] + Math.max(up, left);
}
}
// System.out.println("**************************************");
// for(int i = 0; i < dp.length; i++){
// System.out.println(Arrays.toString(dp[i]));
// }
int rowNum = row - 1;
int columnNum = column - 1;
path[pathLen-1] = rowNum + 1;
for(int i = (pathLen-2); i >= 0 ; i--){
int up= -1, left = -1; // 当前dp[rowNum][columnNum]的左和上位置的最小值为0,所有矩阵外元素值为-1
if((rowNum - 1) >= 0){
up = dp[rowNum - 1][columnNum];
}
if((columnNum - 1) >= 0){
left = dp[rowNum][columnNum-1];
}
if(up >= left){
rowNum--;
path[i] = rowNum + 1;
}else{
columnNum--;
path[i] = rowNum + 1;
}
}
System.out.println(dp[row-1][column-1]);
return path;
}
}