2016廣聯達面試題5

問題描述: 一個n*m的陣列,每一個位置上都有一個值,我們從左上角開始出發,向右下角方向步進。最終到達右下角,找到我們經過路徑上的值的和的最大值,例如圖中最大值爲53。

矩陣爲:
1 10 3 8
12 2 9 6
5 7 4 11

3 7 16 5

問題分析:每一步要麼向下移動,要麼向右移動,定義一個距離矩陣,用來存放從左上角到該位置的最大距離值,每輸入一個值就計算該點的最大距離值。易知該點的最大距離值就是他的上方和左方兩者之間最大的距離值。

上述情況下,其距離矩陣爲:

1 11 14 22
13 15 24 30
18 25 29 41
21 32 48 53

故,該路徑和的最大值爲53。

代碼實現:

public class GetMax {
	public static void main(String[] args) {
		// TODO 自動生成的方法存根
		int[][] nums = {{1,10,3,8},  
                {12,2,9,6},  
                {5,7,4,11},  
                {3,7,16,5} 
             };
		System.out.println(nums.length);
		System.out.println(nums[1].length);
		System.out.println(getMax(nums));

	}	
	public static int getMax(int grid[][]){
		int m,n;//grid的行、列值	
		int i,j;
		if(grid==null||grid.length==0)return -1;
		m=grid.length;//二維矩陣的行數
		n=grid[0].length;//二維矩陣第一行的列數
		int[][] dis = new int[m][n];//距離矩陣
		dis[0][0]=grid[0][0];
		for(i=1;i<m;i++)
			dis[i][0]=dis[i-1][0]+grid[i][0];
		for(j=1;j<n;j++)
			dis[0][j]=dis[0][j-1]+grid[0][j];
		for(i=1;i<m;i++)
			for(j=1;j<n;j++){
				dis[i][j]=Math.max(dis[i-1][j], dis[i][j-1])+grid[i][j];
			}
		return dis[m-1][n-1];
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章