乙個 n 階的樓梯,每次能走 1~2 階,問走到 n 階一共多少種走法?
剛開始遇到這題時,我想到的是數學的做法,也就是排列組合。
數學的解法是這樣的:
以11階台階為例,
所以此時的**就是這樣的
n =
int(
input()
)count =
0a = n //
2b =
1if n %2==
0:while b <= a:
count +=
(math.factorial(n - b)
//(math.factorial(b)
*math.factorial(n -
2*b)))
b +=
1 count +=
1else
:while b <= a:
count +=
(math.factorial(n - b)
//(math.factorial(b)
*math.factorial(n -
2*b)))
# math.factorial 是階乘的意思
b +=
1 count +=
1print
(count)
這樣的結果是執行時間過長
優化時間之後是這樣的
import math
n =int
(input()
)result =
1for i in
range(0
,n):
#i為走一步的次數
if(n-i)%2
!=0:continue
j =(n-i)//2
#j為走兩步的次數
result += math.factorial(i+j)
//(math.factorial(i)
*math.factorial(j)
)#c(n,m+n)
print
(result)
很顯然,這種做法很麻煩,而且說實話,我這樣數學不夠好的人,這種題的數學解法都是拍照搜出來的。所以還有解法二
動態規劃的核心思想:從小問題著手,合併子問題來得到大問題的答案
分析如下:
假設最後的答案為f(n)
要走到 n ,最後一步不是從 n-1 就是從 n-2 走到的
所以 f(n) = f(n-1) + f(n-2)
累加之後有 f(3) = f(1) + f(2)
你會發現這題其實就是斐波那契數列
**實現:
n =
int(
input()
)a =
1b =
2if n <4:
print
(n)else
:for i in
range(3
, n+1)
: a, b = b, a+b
print
(b)
動態規劃 爬樓梯
假設你正在爬樓梯,需要n步你才能到達頂部。但每次你只能爬一步或者兩步,你能有多少種不同的方法爬到樓頂部?比如n 3,1 1 1 1 2 2 1 3,共有3種不同的方法 返回 3 解題思路 沒接觸過動態規劃的時候,我用排列組合做的,在我這篇部落格中 可以看一下。實際上,這個題目就是乙個斐波那契數列,這...
爬樓梯 動態規劃
假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1.1 階 1 階 2.2 階 示例 2 輸入 3 輸出 3 解釋 有三種方法可以爬到樓頂。1...
動態規劃 爬樓梯
假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1.1 階 1 階 2.2 階 示例 2 輸入 3 輸出 3 解釋 有三種方法可以爬到樓頂。1...