lintcode 111 爬樓梯 排列組合方法

2021-08-15 01:44:00 字數 1099 閱讀 6398

問題描述:

假設你正在爬樓梯,需要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 階 解題思路 實現了兩種方法,但是第一種超出時間限制 因為遞迴的時候方...