unique paths

 


A robot is located at the top-left corner of a m x n grid (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?

机器人只能向下和向右走。。走到最后一个位置。求总共多少条路线。这题考察动态规划

1、回溯法。该方法是可以使用的,但是测试的时候,当数字大了以后,会超时。

这是自己写的回溯法,答案是对的。

class Solution {
    int count=0;
    public int uniquePaths(int m, int n) {
        if(m<1&&n<1) return 0;
        
         helper(m,n,0,0);
        return count;
    }
    public void helper(int m,int n,int i,int j){
        if(i==m-1&&j==n-1){ count++; return ;}
        if(i<0||j<0) return ;
        if(i<m-1&&j<n-1){
             helper(m,n,i+1,j);
            helper(m,n,i,j+1);
        }
        if(i==m-1) helper(m,n,i,j+1);
        
        if(j==n-1) helper(m,n,i+1,j);
    }
}

2.动态规划,机器人每次只能向下或者向右,所以当它到达一个点时,它只有两种可能性:

  1),来自上面的点

  2),来自左边的点。

我们就可以得到一个公式。假设点(i,j)处的路径数为p[i][j],则:P[i][j] = P[i - 1][j] + P[i][j - 1].

这里需要处理边界情况,也就是初始化条件,p[0][j]=1,p[i][0]=1.(因为这两个边界只能有一种情况到达)。

class Solution {
    
    public int uniquePaths(int m, int n) {
        int[][] a=new int[m][n];
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++){
                if(i==0||j==0)  ///在上边和左边边界处,只有一种路径到达。
                    a[i][j]=1;
                else
                    a[i][j]=a[i-1][j]+a[i][j-1];
            }
        return a[m-1][n-1];
    }
   
}

3.当然还有一种方法:公式。到终点总共走m+n-2步,其中向下走m-1步,向右走n-1步。现在只要从m+n-2步中选出m-1步就行。二项分布。

int N = n + m - 2;// how much steps we need to do
            int k = m - 1; // number of steps that need to go down
            double res = 1;
            // here we calculate the total possible path number 
            // Combination(N, k) = n! / (k!(n - k)!)
            // reduce the numerator and denominator and get
            // C = ( (n - k + 1) * (n - k + 2) * ... * n ) / k!
            for (int i = 1; i <= k; i++)
                res = res * (N - k + i) / i;
            return (int)res;
原文地址:https://www.cnblogs.com/xiaolovewei/p/8145010.html