本人电子系,只为一学生。心喜计算机,小编以怡情。
有一个机器人的位于一个M×N个网格左上角(下图中标记为’Start’)。
机器人每一时刻只能向下或者向右移动一步。机器人试图达到网格的右下角(下图中标记为’Finish’)。
问有多少条不同的路径?
第一次尝试用的递归,超时了,失败了。。。
public int uniquePaths(int m, int n)
{
// write your code here
if(n==1||m==1) return 1;
return uniquePaths(m, n-1)+uniquePaths(m-1, n);
}
然后发现要用动态规划。。。
然而我还没学。。于是看了爬楼梯和数兔子,迷迷糊糊
反正序列规律是1,2,3,5,8,13,21……..
然后我就猜着写了代码,第一次失败了,原因在注释,后来改了,成功了
public int uniquePaths(int m, int n) {
// write your code here
if(n==1||m==1) return 1;
int temp[][]=new int [m][n];//带记忆功能的,以空间作为代价减轻时间,不过应该有更好的方法,我暂时没想到
//////////////////////////////
for(int i=1;i<m;i++)
temp[i][0]=1;
for(int j=1;j<n;j++)
temp[0][j]=1;
//这段必须有,要给边界初始化为1。没有这段的话比如2*3矩阵,最右下角元素=左边值+上边值,
//结果上边是0的话显然是错误的,因为上边(是边界)必然有一条道路
///////////////////////////
temp[0][1]=1;
temp[1][0]=1;
//中规中矩的动态规划
for(int i=1;i<m;i++)
for(int j=1;j<n;j++)
{
//当前的次数=左边的次数+上面的次数
temp[i][j]=temp[i-1][j]+temp[i][j-1];
}
return temp[m-1][n-1];
}