• 62. Unique Paths


    题目:

    A robot is located at the top-left corner of a m x ngrid (marked 'Start' in the diagram below).

    The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below).

    How many possible unique paths are there?

    Above is a 3 x 7 grid. How many possible unique paths are there?

    Note: m and n will be at most 100.

    链接: http://leetcode.com/problems/unique-paths/

    4/16/2017

    1ms,8%

    一开始几乎忘记怎么做了,决定好好研究DP

    注意:

    第7行初始值设为1

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

    还可以用一维数组rolling array来计算,参考别人答案。多一个元素是为了免掉第一次的全部赋值。

    为什么用了一维数组还是可以的呢?虽然是一维,但是每次i有变化时,res又被重复使用,之前dp[i-1][j]这一部分是在之前算过了。(感觉还是没有解释好)

     1 public class Solution {
     2     public int uniquePaths(int m, int n) {
     3         if (m < 0 || n < 0) return 0;
     4         int[] dp = new int[n + 1];
     5         dp[0] = 1;
     6         
     7         for (int i = 1; i <= m; i++) {
     8             for (int j = 1; j <= n; j++) {
     9                 dp[j] += dp[j - 1];
    10             }
    11         }
    12         return dp[n - 1];
    13     }
    14 }

    关于rolling array很详细的解释

    https://discuss.leetcode.com/topic/15265/0ms-5-lines-dp-solution-in-c-with-explanations

    如何实现combination的实现

    https://discuss.leetcode.com/topic/2734/my-ac-solution-using-formula

     1 class Solution {
     2     public:
     3         int uniquePaths(int m, int n) {
     4             int N = n + m - 2;// how much steps we need to do
     5             int k = m - 1; // number of steps that need to go down
     6             double res = 1;
     7             // here we calculate the total possible path number 
     8             // Combination(N, k) = n! / (k!(n - k)!)
     9             // reduce the numerator and denominator and get
    10             // C = ( (n - k + 1) * (n - k + 2) * ... * n ) / k!
    11             for (int i = 1; i <= k; i++)
    12                 res = res * (N - k + i) / i;
    13             return (int)res;
    14         }
    15     };

    通过permutation来实现combination

    https://discuss.leetcode.com/topic/19613/math-solution-o-1-space

     1 public class Solution {
     2     public int uniquePaths(int m, int n) {
     3         if(m == 1 || n == 1)
     4             return 1;
     5         m--;
     6         n--;
     7         if(m < n) {              // Swap, so that m is the bigger number
     8             m = m + n;
     9             n = m - n;
    10             m = m - n;
    11         }
    12         long res = 1;
    13         int j = 1;
    14         for(int i = m+1; i <= m+n; i++, j++){       // Instead of taking factorial, keep on multiply & divide
    15             res *= i;
    16             res /= j;
    17         }
    18             
    19         return (int)res;
    20     }
    21 }

    更多讨论:

    https://discuss.leetcode.com/category/70/unique-paths

  • 相关阅读:
    一个空类会生成哪些默认函数
    What is VMR(Video Mixing Render)From MSDN
    DirectX backface culling(背面剔除)
    D3DPOOL(资源池)
    两道概率题供大家周末把玩
    空间两点间的距离
    n != n, n == n
    C++默认参数
    D3DPT_TRIANGLELIST与D3DPT_TRIANGLESTRIP
    D3D中的设备丢失
  • 原文地址:https://www.cnblogs.com/panini/p/6721407.html
Copyright © 2020-2023  润新知