给定一个m行n列的矩阵,矩阵每个元素是一个正整数,你现在在左上角(第一行第一列),你需要走到右下角(第m行,第n列),每次只能朝右或者下走到相邻的位置,不能走出矩阵。走过的数的总和作为你的得分,求最大的得分。
public class MatrixMN {
public static void main(String[] args) throws Exception {
int row = 5;
int col = 4;
int[][] array = new int[row][col];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
array[i][j] = (int) (Math.random() * 10) + 1;
}
}
printMatrix(array);
System.out.println(test(array,row,col));
}
public static int test(int[][] array, int row, int col) {
int[][] matrix = new int[row+1][col+1];
// 第一行
for (int i = 0; i <= col; i++) {
matrix[0][i] = 0;
}
// 第一列
for (int i = 0; i <= row; i++) {
matrix[i][0] = 0;
}
printMatrix(matrix);
for (int i = 1; i <= row; i++) {
for (int j = 1; j <= col; j++) {
int x = array[i-1][j-1]; // 当前位置的值
int left = matrix[i][j - 1]; // 左边的
int up = matrix[i - 1][j];// 上面的
matrix[i][j] = Math.max(x+left , x+up);
}
}
// Printing the matrix
printMatrix(matrix);
return matrix[row][col];
}
private static void printMatrix(int[][] matrix) {
for (int[] row_val : matrix) {
for (int val : row_val) {
System.out.format("%5d", val);
}
System.out.println();
}
System.out.println();
}
}
结果:
6 3 3 2
3 1 4 8
5 8 7 5
2 3 7 10
8 5 9 4
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 6 9 12 14
0 9 10 16 24
0 14 22 29 34
0 16 25 36 46
0 24 30 45 50
50