https://leetcode-cn.com/problems/unique-paths/

法一:排列组合

image.png
image.png

  1. public int uniquePaths(int m, int n) {
  2. long ans = 1;
  3. for (int x = n, y = 1; y < m && x <= m + n - 2; ++x, ++y) {
  4. ans = ans * x / y;
  5. }
  6. return (int) ans;
  7. }

image.png
排列组合问题。。。。
从(0, 0)往下最多能走5步,往右最多能走4步,

image.png

法二:动态规划

  1. public int uniquePaths(int m, int n) {
  2. return process(0, 0, m, n);
  3. }
  4. private int process(int row, int col, int m, int n) {
  5. if (row == m - 1 && col == n - 1) {
  6. return 1;
  7. }else if (row == m - 1) {
  8. return 1;
  9. }else if (col == n - 1) {
  10. return 1;
  11. }else if (row > m - 1 || col > n - 1) {
  12. return 0;
  13. }
  14. return process(row, col + 1, m, n) + process(row + 1, col, m, n);
  15. }
  1. public int uniquePaths(int m, int n) {
  2. int[][] dp = new int[m][n];
  3. for (int i = n - 1; i >= 0; i--) {
  4. dp[m - 1][i] = 1;
  5. }
  6. for (int i = 0; i < m; i++) {
  7. dp[i][n - 1] = 1;
  8. }
  9. for (int i = m - 2; i >= 0; i--) {
  10. for (int j = n - 2; j >= 0; j--) {
  11. dp[i][j] = dp[i][j + 1] + dp[i + 1][j];
  12. }
  13. }
  14. return dp[0][0];
  15. }