1. 程式人生 > >矩陣從左上角到右下角的最優路徑使得經過路徑上的權值和最大(最小)

矩陣從左上角到右下角的最優路徑使得經過路徑上的權值和最大(最小)

描述:
有一張藏寶圖,而藏寶圖描述的所在區域(只有一個左上角入口和一個右下角出口)被分為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; } }