走台阶
public class JumpFloor {public static int JumpFloor2(int n) {if (n == 1 || n == 2) return n;int pre1 = 1;int pre2 = 2;int current = pre1 + pre2;for (int i = 3; i <= n; i++) {current = pre1 + pre2;pre1 = pre2;pre2 = current;}return current;}public static int JumpFloor1(int n) {if (n == 1 || n == 2) return n;return JumpFloor1(n - 1) + JumpFloor1(n - 2);}public static void main(String[] args) {System.out.println(JumpFloor2(1));System.out.println(JumpFloor2(2));System.out.println(JumpFloor2(3));System.out.println(JumpFloor2(4));}
}
走方格,总共有几种走法
public class MatrixPathWays {public static void main(String[] args) {System.out.println(countWays1(3, 5));System.out.println(countWays2(3, 5));System.out.println(countWays3(3, 5));}public static int countWays1(int x, int y) {if (x == 1 || y == 1)return 1;return countWays1(x - 1, y) + countWays1(x, y - 1);}public static int countWays2(int x, int y) {int[][] dp = new int[x][y];for (int row = 0; row < x; ++row) {dp[row][0] = 1;}for (int column = 0; column < y; ++column) {dp[0][column] = 1;}for (int row = 1; row < x; ++row)for (int column = 1; column < y; ++column) {dp[row][column] = dp[row][column - 1] + dp[row - 1][column];}return dp[x - 1][y - 1];}public static int countWays3(int x, int y) {int[][] dp = new int[x][y];for (int row = 0; row < x; ++row)for (int column = 0; column < y; ++column) {if (row == 0) {dp[0][column] = 1;} else if (column == 0) {dp[row][0] = 1;} else {dp[row][column] = dp[row][column - 1] + dp[row - 1][column];}}return dp[x - 1][y - 1];}
}
走方格,求最大最小值的路径
public class MatrixPathMaxOrMin {public static int minPathSum(int[][] matrixArr) {if (matrixArr == null || matrixArr.length == 0 ||matrixArr[0] == null || matrixArr[0].length == 0) {return 0;}int row = matrixArr.length;int col = matrixArr[0].length;int[][] dp = new int[row][col];dp[0][0] = matrixArr[0][0];for (int i = 1; i < row; i++) {dp[i][0] = dp[i - 1][0] + matrixArr[i][0];}for (int j = 1; j < col; j++) {dp[0][j] = dp[0][j - 1] + matrixArr[0][j];}for (int i = 1; i < row; i++) {for (int j = 1; j < col; j++) {dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + matrixArr[i][j];}}return dp[row - 1][col - 1];}public static int[][] createMatrix(int m, int n) {int[][] matrix = new int[m][n];int seed = 0;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {seed = (int) ((Math.random() * 10) + 1);matrix[i][j] = seed;}}return matrix;}public static void printMatrix(int[][] matrix) {for (int i = 0; i < matrix.length; i++) {for (int j = 0; j < matrix[0].length; j++) {System.out.print(matrix[i][j] + "\t");}System.out.println();}}public static void main(String[] args) {int[][] matrix = createMatrix(3, 3);printMatrix(matrix);int sum = minPathSum(matrix);System.out.println("sum = " + sum);}}
走方格,有障碍,总共有几种走法
public class MatrixPathWithObstacles {public static void main(String[] args) {int[][] arr = {{0, 0, 0},{0, 0, 0},{0, 1, 0},};System.out.println(uniquePathsWithObstacles(arr));System.out.println(uniquePathsWithObstacles2(arr));}public static int uniquePathsWithObstacles(int[][] matrixArr) {int row = matrixArr.length;int column = matrixArr[0].length;int[][] dp = new int[row][column];dp[0][0] = 1;for (int i = 1; i < column; i++) {if (matrixArr[0][i] == 0) {dp[0][i] = dp[0][i - 1];}}for (int i = 1; i < row; i++) {if (matrixArr[i][0] == 0) {dp[i][0] = dp[i - 1][0];}}for (int i = 1; i < row; i++) {for (int j = 1; j < column; j++) {if (matrixArr[i][j] == 0) {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}}return dp[row - 1][column - 1];}public static int uniquePathsWithObstacles2(int[][] obstacleGrid) {int row = obstacleGrid.length;int column = obstacleGrid[0].length;int[][] dp = new int[row][column];for (int i = 0; i < column; i++) {if (obstacleGrid[0][i] == 1)break;dp[0][i] = 1;}for (int i = 0; i < row; i++) {if (obstacleGrid[i][0] == 1)break;dp[i][0] = 1;}for (int i = 1; i < row; i++) {for (int j = 1; j < column; j++) {if (obstacleGrid[i][j] == 1) {dp[i][j] = 0;} else {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}}return dp[row - 1][column - 1];}}