lintcode 111. 爬楼梯 排列组合方法

问题描述:

  假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部?

问题目前解法 其实 是斐波那契数列 ,因为一次只能走1步或2步,第n 阶楼梯,是从n-1或n-2那一阶梯上来的,方法数也

就是两者之和,通项 A(n)=A(n-1)+A(n-2)

但是

在下第一次见到这个题时能力太低,难免会对他的解法..... 没这么高端 


1设上楼梯有 i 步是一次走了两个台阶,那么会有n-2i步是走了阶,一共走了n-i步

2走n 阶楼梯最多会有 int(n/2)步是走了两阶的

*3当走了 i 步两个台阶,到达第n阶,的走法就刚好是 C(i,n-i)=A(i,n-i)/i!=(n-i)!/((n-2i)!*(i)!)

4所有方法数 就是从 i=1到 i=int(n/2)所有方法数之和

*3的证明:

  走了 i 个两步, 那走到n 阶 一共走了n-i步,方法数为 n-i个不同元素的排列数除以i 个不同元素的排列数和n-2i个不同  元素的排列数之积,
n-i的阶乘除 i的阶乘和n-2i的阶乘,A(n-i,n-i)/(A(n-2i,n-2i)*A(i,i))  即为(n-i)!/((n-2i)!*(i)!)
刚好 为从 n-i个不同元素i 个不同元素的组合数  C(i,n-i)

代码(python):

 

def climbStairs(self, n):
        # write your code here
        if n==0 :
            return n
        def C(n,m):            #定义一个求组合数的函数
            result = 1
            n=n-m
            for i in xrange(1,m+1):  
                result *=(n+i)/float(i)
            return result
        
        end=1
        for i in xrange(1,int(n/2)+1):
        	end+=C(n-i,i)     #求i=1到n-i的所有方法数
        
        return int(end)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值