1. 程式人生 > >求解N*N表格中從0,0到n,n所過有權路徑的最大值

求解N*N表格中從0,0到n,n所過有權路徑的最大值

有一個表格,從左上角到右下腳.每個路徑都有不同值.求經過的路徑所能累加的最大值.

可以用動態規劃,來實現.

說一下思路,請結合程式碼

matrix 有路徑值的二維表  table一個和matrix相同大小的空表;table上的每個點的值代表著到達這個點所需要的最大值

1.要從(0,0)遍歷整個matrix

2.將遍歷matrix的當前值儲存到變數 cur 中.

  1. 當i=0,j=0 直接讓table(0,0) = cur,因為這是第一步,沒得選
  2. 當i=0,j!=0時 讓 table(i,j) = cur + table(i,j-1) 因為當i=0時,當前點在y軸上,它只能從matrix(i,j-1) 移動到matrix(i,j)
  3. 同上 當j=0時 讓table(i,j) = cur + table(i-1,j)
  4. 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));

	}
}