第一种最简单的方法:递归求解:
int uniquePaths(int m, int n) {
if(m==1&&n==1)
return 1;
if(m==1)
return uniquePaths(m,n-1);
if(n==1)
return uniquePaths(m-1,n);
if(m>1&&n>1)
return uniquePaths(m-1,n)+uniquePaths(m,n-1);
}
但是递归方法太费时间,out
第二种方法,动态规划的思想:
vector<vector<int>> dp(m,vector<int> (n,1));
for(int i=1;i<m;i++)
for(int j=1;j<n;j++)
{
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
return dp[m-1][n-1];
时间复杂度为O(n^2),cost m*nspace
第三种方法: 数学计算法:
如果有4*6 个格子,相当于有3个下,5个右,进行排列组合。得到排列的数目就ok
总共有(m+n)! / (m! * n!)种排列方法
原文:http://www.cnblogs.com/fanhaha/p/7348166.html