题目:不同路径

解法一:

定义状态:dp[ i ][ j ] 指的是”走到点(i,j)的不同路径数量

状态转移:dp[ i ][ j ] = dp[ i - 1 ][ j ] + dp[ i ][ j - 1],即“要想走到点(i, j),只有两个选择——从(i-1,j)向下走,或者从(i,j-1)向右走

 1int uniquePaths(int m, int n)
 2{
 3    int dp[m][n];
 4    for(int i = 0; i < m; i++) dp[i][0] = 1;
 5    for(int i = 0; i < n; i++) dp[0][i] = 1;
 6    for(int i = 1; i < m; i++)
 7    {
 8        for(int j = 1; j < n; j++)
 9        {
10            dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
11        }
12    }
13    return dp[m - 1][n - 1];
14}

解法二:

第一个方法的空间复杂度是m*n,然而在每一次的计算中,实际只用到了两个元素,所以可以进行优化

只需要维护一个一维数组,dp[j]代表着当前元素,使用dp[j]自加dp[j-1](左边的元素),等价于 dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为旧的dp[j]就是当前元素的上面一个元素

 1int uniquePaths(int m, int n)
 2{
 3    std::vector<int> dp(n, 1);
 4    for(int i = 1; i < m; i++)
 5    {
 6        for(int j = 1; j < n; j++)
 7        {
 8            dp[j] += dp[j - 1];
 9        }
10    }
11    return dp[n - 1];
12}