Leetcode每日一题:62.unique-paths(不同路径)_动态规划
思路:一开始用的BFS,超时了,感觉这题可以用数学方程做,但懒得推理了,直接用的动态规划;算是动态规划入门题吧;path[i][j]表示点(i,j)到重点的不同路径个数,那么path[i][j]=path[i+1][j]+path[i][j+1],一开始处理边界,最后一列和最后一行都置为1,因为它们到终点只有一条路径,然后用方程即可;
Leetcode每日一题:62.unique-paths(不同路径)_i++_02

//动态规划
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++;
// }