動態規劃 爬樓梯

2021-10-12 01:49:51 字數 1643 閱讀 5188

乙個 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...