NC34 求路径
题意分析:
算出从起点到终点的路径数目。
题解一(动态规划):
假设机器人站在点(i,j)处,其可以从(i-1,j)向下移动一行走到,也可以从向右移动一步走到。因此到达位置(i,j)出路径的数目等于到达位置(i-1,j)的路径数目 与达到(i,j-1)的路径数目之和。我们假设dp[i,j]表示到达点(i,j)的路径数目,那么dp[i,j] = dp[i-1,j]+dp[i,j-1]。我们新建一个二维表格dp,计算dp里面每一个值,最后返回目标位置的dp即可。
初始化,第一行和第一列的dp值全部为1,这些位置可以确定只有一条路径。表格的其他位置,根据转移方程,进行填充即可。
如下图,站在红叉的位置,根据规则,其只能从其左边和上面走到,那么到达红叉的走法就是前两步骤的和。
代码实现如下:
int uniquePaths(int m, int n) { vector<vector<int>>dp(m,vector<int>(n,0)); //第一行初始化,只有一条路径 for(int i=0;i<n;i++){ dp[0][i] = 1; } //第一列初始化,只有一条路径 for(int i=0;i<m;i++){ dp[i][0] =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];
时间复杂度:,我们循环了m*n次,时间复杂度
空间复杂度:,在本题实现中,求解一行中某个位置的值,实际上只用了上一行和该位置左边的元素,因此空间复杂度可以降低为。
方法二:组合数学
思路与算法
由于在矩阵中没有障碍物,从左左上角移动到右下角一共要移动m+n-2次,其中有m-1次向下,n-1次向右,对这两种操作进行组合。因此最后就是求这个组合数。
组合公式为,直接算该值即可。
int uniquePaths(int m, int n) { long long ret = 1; for (int x = n, y = 1; y < m; ++x, ++y) { //组合公式的循环求解 ret = ret * x / y; } return ret; }
时间复杂度:
空间复杂度: