矩陣從左上角到右下角的最優路徑使得經過路徑上的權值和最大(最小)
阿新 • • 發佈:2018-12-24
描述:
有一張藏寶圖,而藏寶圖描述的所在區域(只有一個左上角入口和一個右下角出口)被分為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;
}
}