题目链接:https://leetcode.com/problems/unique-paths/
方法一:
思路用dp,可以观察到这个题目存在最优子结构,可以重复使用,
dp[i][j]=dp[i-1][j]+dp[i][j-1];
然后就可以很好地求解了,注意初始化。
AC 0ms 100% Java:
class Solution {
public int uniquePaths(int m, int n) {
int[][] dp=new int[m][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];
}
}
方法二:回溯
经过实践,回溯会超时,它并没有利用已有的解,造成了重复计算。
顺便贴个代码吧,例子通过了,最后提交超时了。
class Solution {
public int uniquePaths(int m, int n) {
return search(m,n,0,0);
}
public int search(int m,int n,int i,int j){
if(i==m-1&&j==n-1)
return 1;
if(i>m-1||j>n-1)
return 0;
return search(m,n,i+1,j)+search(m,n,i,j+1);
}
}
后来想了一下,可以用辅助数组保存回溯递归时节点的值,不过那有和dp
思路有点相同了。