思路:一开始用的BFS,超时了,感觉这题可以用数学方程做,但懒得推理了,直接用的动态规划;算是动态规划入门题吧;path[i][j]
表示点(i,j)
到重点的不同路径个数,那么path[i][j]=path[i+1][j]+path[i][j+1]
,一开始处理边界,最后一列和最后一行都置为1,因为它们到终点只有一条路径,然后用方程即可;
//动态规划
int uniquePaths(int m, int n)
{
if (m == 1 && n == 1)
return 1;
vector<vector<int>> path(m, vector<int>(n, 0));
//最右边一列和最下面一行的路径个数都只能为1
for (int i = 0; i < m; i++)
path[i][n - 1] = 1;
for (int i = 0; i < n; i++)
path[m - 1][i] = 1;
for (int i = m - 2; i >= 0; i--)
{
for (int j = n - 2; j >= 0; j--)
{
path[i][j] = path[i + 1][j] + path[i][j + 1];
}
}
return path[0][0];
}
// BFS
// int uniquePaths(int m, int n)
// {
// if (m == 1 && n == 1)
// return 1;
// queue<vector<int>> q;
// q.push({0, 0});
// int count = 0;
// while (!q.empty())
// {
// int len = q.size();
// while (len--)
// {
// vector<int> loc = q.front();
// q.pop();
// if (loc[0] == m - 1 && loc[1] == n - 1)
// {
// count++;
// continue;
// }
// //如果还能向下走
// if (loc[0] + 1 < m)
// q.push({loc[0] + 1, loc[1]});
// //如果还能向右走
// if (loc[1] + 1 < n)
// q.push({loc[0], loc[1] + 1});
// }
// }
// return count++;
// }