問題描述: 一個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];
}
}