题目描述:寻找一条从左上角arr[0][0]到右下角arr[m-1][n-1]的路线,使得沿途经过的数组中的整数之和最小
代码:
java版实现:
public class FindRoute {
public static int getMinPath(int[][] arr){
if (arr == null || arr.length == 0){
return 0;
}
int row = arr.length;
int col = arr[0].length;
// 用来保存计算的中间值
int[][] cache = new int[row][col];
cache[0][0] = arr[0][0];
for (int i = 1; i < col; i++){
cache[0][i] = cache[0][i - 1] + arr[0][i];
}
for (int j = 1; j < row; j++){
cache[j][0] = cache[j - 1][0] + arr[j][0];
}
System.out.println("["+(0)+","+0+"]: " + arr[0][0]);
// 在遍历二维数组的过程中不断把计算结果保存到cache中
for (int i = 1; i < row; i++){
for (int j = 1; j < col; j++){
if (cache[i - 1][j] > cache[i][j - 1]){ // 可以确定选择的路线为arr[i][j - 1]
cache[i][j] = cache[i][j - 1] + arr[i][j];
System.out.println("["+i+","+(j - 1)+"]: " + arr[i][j - 1]);
}else { // 可以确定选择的路线为arr[i - 1][j]
cache[i][j] = cache[i - 1][j] + arr[i][j];
System.out.println("["+(i - 1)+","+j+"]: " + arr[i - 1][j]);
}
}
}
System.out.println("[" +(row - 1) + "," + (col - 1) + "]" + arr[row - 1][col - 1]);
return cache[row - 1][col - 1];
}
public static void main(String[] args){
int[][] arr = {
{1,4,3,3},
{8,7,5,5},
{2,1,5,5},
{2,1,5,5}
};
System.out.println("路径:");
System.out.println("最小值为:"+getMinPath(arr));
}
}