刚开始的时候没想初始化对递推公式的影响
把递推公式复杂化了dp[i][j]=(i>0?dp[i-1][j]:0)+(j>0?dp[i][j-1]:0)
加上了当前坐标左边和上边的合法判断
后面将第一行和第一列初始化为1后(因为这上面的坐标只能够从一个方向走来),就可以将递推公式化简:dp[i][j]=dp[i-1][j]+dp[i][j-1]
然后这一题还学到了二维vector带大小的定义,以前从来没用过:vector<vector<int>> dp(行数,vector<int> (列数,初始化的值?))----这里最后一个参数不知道是不是这个意思
int uniquePaths(int m, int n) {
/*
遇到要脑子的dp题就不会了(T.T)(最后还是靠自己想出来了)
dp数组的含义
需要定义为二维dp数组
dp[i][j]代表从[0][0]到[i][j]有多少种走法
递推公式
因为robot只能向下或向右走
不做初始化操作
所以判断当前坐标的左和上是否合法
如果合法则相加
**若该方向上的上一个坐标不合法则看作0(因为无法到达所以0种方法)
即dp[i][j]=(i>0?dp[i-1][j]:0)+(j>0?dp[i][j-1]:0)
做初始化操作
直接dp[i][j]=dp[i-1][j]+dp[i][j-1];
初始化
需要将[0][0]初始化为1
如果将第一行和第一列全部初始化为1
可以节省时间
遍历方式
因为是二维数组
所以按行从左到右遍历
*/
// 二维vector数组的定义我还真不会
vector<vector<int>> dp(m,vector<int> (n));
// 分别对第一列和第一行初始化操作
for (int i = 0; i < m; i++)
dp[i][0] = 1;
for (int j = 0; j < n; j++)
dp[0][j] = 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];
}