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];
	}
}


猜你喜欢

转载自blog.csdn.net/ncut_nwpu/article/details/80010074