给定一个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