题目:编程
思路一:数组
动态规划。建立一个mxn的二维数组,数组内存储到达每一个点的路径数量N。动态规划推导式,N(i,j) = N(i-1, j) + N(i, j-1)。spa
思路二:code
从左上角出发,终点是右下角,每次只能向右走(R)或者向下走(D)。总共须要向右移动 n-1 次,向下移动 m-1 次,一共要移动 m+n-2 次。求从起点到终点的全部路径,问题能够转换为,有 m+n-2 个抽屉,有 n-1 把钥匙,每一个抽屉最多只能放1把钥匙,有多少种放置方案。排列组合问题。blog
编程计算排列组合,注意一点,分子和分母的阶乘运算致使int类型的变量溢出。内存
class Solution { public: int uniquePaths(int m, int n) { double result = 1.0; int remain = 1; int num = min(m-1, n-1); for(int i = 0; i < num; ++i) { if( ((m+n-2-i)%(i+1)) == 0 ) // 单项实现整除 result *= ((m+n-2-i)/(i+1)); else { if( result/(i+1) > int(result/(i+1)) ) // 前几项的积可以整除(i+1) result /= (i+1); else // 前几项的积没法整除(i+1) remain *= (i+1); result *= (m+n-2-i); } } result /= remain; return result; } };