LintCode 114 不同的路径

本人电子系,只为一学生。心喜计算机,小编以怡情。

有一个机器人的位于一个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];


        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值