一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径?
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/unique-paths
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
//回溯算法,超出时间限制
int num = 0;
void backtrack(int now_m, int now_n, int target_m, int target_n)
{
if(now_m == target_m && now_n == target_n)
{
num++;
return;
}
if(now_m + 1 <= target_m)
{
backtrack(now_m+1, now_n,target_m, target_n);
}
if(now_n + 1 <= target_n)
{
backtrack(now_m, now_n+1, target_m, target_n);
}
}
int uniquePaths(int m, int n){
num = 0;
backtrack(1, 1, m, n);
return num;
}
//动态规划
int uniquePaths(int m, int n){
int num = 0;
int **dp = (int**)malloc(sizeof(int*) * m);
for(int i = 0; i < m; i++)
{
int *temp = (int*)malloc(sizeof(int) * n);
dp[i] = temp;
}
for(int i = 0; i < m; i++)
{
dp[i][0] = 1;
}
for(int i = 0; i < n; i++)
{
dp[0][i] = 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];
}
算法:动态规划
动态规划先找出状态转移方程,由题目可以得知,机器人每次只能向下或者向右移动一步,那么就是说到达本方格的路径数由上方和左方的格子相加得到。
状态转移方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]