题目描述
思路分析
Ⅰ题:
方法1:线性dp,转移方程
f
[
i
]
[
j
]
=
f
[
i
−
1
]
[
j
]
+
f
[
i
]
[
j
−
1
]
f[i][j]=f[i-1][j]+f[i][j-1]
f[i][j]=f[i−1][j]+f[i][j−1]
当然要先判断下
f
[
i
−
1
]
[
j
]
f[i-1][j]
f[i−1][j]和
f
[
i
]
[
j
−
1
]
f[i][j-1]
f[i][j−1]是否越界;
方法2:排列组合
(
n
+
m
−
2
n
−
1
)
n+m-2\choose n-1
(n−1n+m−2)
Ⅱ题:
还是dp,不过注意有石头的地方
f
[
i
]
[
j
]
=
0
f[i][j]=0
f[i][j]=0
代码实现
//Ⅰ.dp
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> f(n,vector<int>(m));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(i==0&&j==0) f[i][j]=1;
else{
if(i) f[i][j]+=f[i-1][j];
if(j) f[i][j]+=f[i][j-1];
}
}
}
return f[n-1][m-1];
}
};
//Ⅰ.组合
class Solution {
public:
int uniquePaths(int m, int n) {
int a = m + n - 2;
int b = max(m , n);
long long ans = 1;
for(int i = b; i <=a; i++)
ans *= i;
for(int i = 1; i <= a - b + 1; i++)
ans /= i;
return res;
}
};
//Ⅱ.dp
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& a) {
int n=a.size(),m=a[0].size();
if(n==0||m==0) return 0;
vector<vector<int>> f(n,vector<int>(m));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(!a[i][j]){
if(i==0&&j==0)f[i][j]=1;
else{
if(i) f[i][j]+=f[i-1][j];
if(j) f[i][j]+=f[i][j-1];
}
}
}
}
return f[n-1][m-1];
}
};