求解N*N表格中從0,0到n,n所過有權路徑的最大值
阿新 • • 發佈:2018-12-12
有一個表格,從左上角到右下腳.每個路徑都有不同值.求經過的路徑所能累加的最大值.
可以用動態規劃,來實現.
說一下思路,請結合程式碼
matrix 有路徑值的二維表 table一個和matrix相同大小的空表;table上的每個點的值代表著到達這個點所需要的最大值
1.要從(0,0)遍歷整個matrix
2.將遍歷matrix的當前值儲存到變數 cur 中.
- 當i=0,j=0 直接讓table(0,0) = cur,因為這是第一步,沒得選
- 當i=0,j!=0時 讓 table(i,j) = cur + table(i,j-1) 因為當i=0時,當前點在y軸上,它只能從matrix(i,j-1) 移動到matrix(i,j)
- 同上 當j=0時 讓table(i,j) = cur + table(i-1,j)
- i!=0,j!=0時 需要進行一個判斷 Math.max(table[i-1][j], table[i][j-1]) 選擇其中一個大的加上 cur
3.最後遍歷完成後,返回 table(n-1,n-1)
package dynamic.programming; public class DynamicProg { public static int findMax(int[][] matrix) { int len = matrix.length; int[][] table = new int[len][len]; for(int i=0;i<len;i++) for(int j=0;j<len;j++) { int cur = matrix[i][j]; if(i==0&&j==0) table[i][j] = cur; else if(i==0) table[i][j] = cur + table[i][j-1]; else if(j==0) table[i][j] = cur + table[i-1][j]; else table[i][j] = cur + Math.max(table[i-1][j], table[i][j-1]); } return table[len-1][len-1]; } public static void main(String[] args) { int[][] arr = new int[6][6]; int len = arr.length; for(int i=0;i<len-1;i++) { for(int j=0;j<len-1;j++) { arr[i][j] = (int)(Math.random()*100); System.out.print(arr[i][j]+" "); } System.out.println(); } System.out.println(findMax(arr)); } }