62. 不同路径(leetcode 62#java)
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
解法:从递归到记忆化搜索,以及动态规划
分别描述,方便理解
public int res;
public int uniquePaths(int m, int n) {
//递归解法
int mlen=m-1;
int nlen=n-1;
res=0;
dfs(0,0,mlen,nlen);
return res;
}
public void dfs(int x,int y,int mlen,int nlen){
if(x==mlen&&y==nlen){
res++;
return;
}
if(y+1<=nlen)
dfs(x,y+1,mlen,nlen);
if(x+1<=mlen)
dfs(x+1,y,mlen,nlen);
}
}
class Solution {
public int res;
public int[][]memo;
public int uniquePaths(int m, int n) {
//记忆化搜索
int mlen=m-1;
int nlen=n-1;
memo=new int[m][n];
dfs(0,0,mlen,nlen);
return res;
}
public int dfs(int x,int y,int mlen,int nlen){
if(memo[x][y]!=0)
return memo[x][y];
res=0;
if(x==mlen&&y==nlen){
res++;
return memo[x][y]=res;
}
if(y+1<=nlen)
res=res+dfs(x,y+1,mlen,nlen);
if(x+1<=mlen)
res=res+dfs(x+1,y,mlen,nlen);
return memo[x][y]=res;
}
}
*/
class Solution {
public int uniquePaths(int m, int n) {
//动态规划
int [][] memo=new int[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i==0||j==0)
memo[i][j]=1;
else{
memo[i][j]=memo[i-1][j]+memo[i][j-1];
}
}
}
return memo[m-1][n-1];
}
}