問題描述:
假設你正在爬樓梯,需要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)
lintcode練習 111 爬樓梯
假設你正在爬樓梯,需要n步你才能到達頂部。但每次你只能爬一步或者兩步,你能有多少種不同的方法爬到樓頂部?比如n 3,1 1 1 1 2 2 1 3,共有3種不同的方法 返回 3 很經典的動態規劃問題,第一階只有1,第二階有1 1,2兩種,第三階就有 1,1,1 1,2 2,1三種,第四階有2 3 5...
python爬樓梯遞迴 爬樓梯(Python3)
假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1 階 1 階 和 2 階 解題思路 實現了兩種方法,但是第一種超出時間限制 因為遞迴的時候方...
python爬樓梯演算法 爬樓梯(Python3)
假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1 階 1 階 和 2 階 解題思路 實現了兩種方法,但是第一種超出時間限制 因為遞迴的時候方...