1. 题目描述
难度:中等
2. 题目分析
这是一道典型的动态规划问题,这道题有两种解法,一种是动态规划,一种是排列组合:
- 动态规划
假设我们要对m=7, n =4的网格进行计算(如下图所示):那么所有可能的路径分为两种,一种是从上方过来的,一种是从左边过来的,就如两个箭头标的方向一致。
如下图所示,从左边过来的路径的数量和m=6,n=4网格(红色框)的总路径一样,从上边过来的路径的数量和m=7,n=3的网格(蓝色框)的路径数量一样,所以m=7, n =4的网格的数量可以表示为:
所以动态规划的方程式可以写成:
- 排列组合
这其实是一道高中我们经常遇到的数学题,我们可以将他转化为数学中的排列组合问题来解决。假设m=7,n=4的网格,我们需要向右移动6步,向下移动3步就能到达终点。至于何时向右何时向下就可以用组合来计算了。就是从9个步里面选出3步走下即可,一个简单的组合问题。
3. C语言实现
3.1 动态规划
代码如下:
int uniquePaths(int m, int n){
if(m == 1 || n == 1) return 1;
int res = 0, i, j;
int dp[m][n];
// 将单边界的情况赋值为1
for(i = 0; i < m; i++){
dp[i][0] = 1;
}
for(j = 0; j < n; j++){
dp[0][j] = 1;
}
// 动态规划
for(i = 1; i < m; i++){
for(j = 1; j < n; j++){
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[m-1][n-1];
}
运行结果为:
3.2 排列组合
代码如下:
int uniquePaths(int m, int n) {
int N=m+n-2;
int M=m<n?m-1:n-1;
//计算 C(N,M)
//根据:C(N,M)=C(N,M-1)*M/(N-M+1);
long ans=1;
for(int i=1;i<=M;i++)
ans=ans*(N-i+1)/i;
return ans;
}
运行结果为: