问题描述: 一个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];
}
}