题目
思路
典型的动态规划问题
把m*n的地图看成m*n的二维数组dp,dp[i][j]的值是到该位置共有多少走法。
简单列出几个位置的走法后可以发现:dp[i][j]=dp[i-1][j]+dp[i][j-1];
这是因为:当到达位置(i-1,j)后,从(i-1,j)到(i,j)只有一种走法;同理,到达位置(i,j-1)后,从(i,j-1)到(i,j)只有一种走法。
最终得到上述递推公式:dp[i][j]=dp[i-1][j]+dp[i][j-1];
初始状态:dp[1][1]=1…dp[1][n]=1;(行号、列号从1开始)
优化
从递推公式可看出,二维数组dp中,dp[i][j]只跟上方和前一个数有关,所以可优化dp为一维数组dp[n],
递推公式变为:dp[j]=dp[j]+dp[j-1];
c++代码
class Solution {
public:
int uniquePaths(int m, int n) {
int dp[101];
for (int i = 1; i < 101; i++)dp[i] = 1; //初始状态
for (int row = 2; row <= m; row++) //从第二行开始,计算到第m行
for (int col = 2; col <= n; col++) //第一列不变,只计算前n列即可
dp[col] += dp[col - 1];
return dp[n];
}
};