爬樓梯假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是乙個正整數。
示例 1:
輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。
1 階 + 1 階
2 階示例 2:
輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。
1 階 + 1 階 + 1 階
1 階 + 2 階
2 階 + 1 階
首先判斷這是一道使用動態規劃的題目
為什麼?
一道可以使用動態規劃的題目應滿足以下三要素:
1.最優子結構:最優子結構是指每個階段的最優狀態可以從之前某個階段的某個或某些狀態直接得到(子問題的最優解能夠決定這個問題的最優解)
在該題目中設n階台階有f(n)種方法,則必然有f(n)=f(n-1)+f(n-2),即每一階段的解可以有前兩個階段的解直接得到。
2.邊界:邊界指的是問題最小子集的解(即初始範圍)
此題中有最初階段的解為f(1)與f(2),即可以此為基礎進行遞迴運算
3.狀態轉移函式:這個最好理解,是指從乙個階段向另乙個階段過度的具體形式,描述的是兩個相鄰子問題之間的關係,即可以直觀表達為遞推函式表示式
至此我們至少可以立馬意識到我們需要在**裡做出兩件事:
1.初始化f(1)與f(2),這是邊界,即初始狀態,必須先直接給出
2.用程式語言表達出f(n)=f(n-1)+f(n-2);顯然要用到迴圈結構
下面給出標準答案**
n =
int(
input()
)# 使用者輸入,一定不要忘記將讀入的字串轉化為整型
if n <=2:
f = n;
# 易得當n=1或2時,f(n)=n;
else
: a =
1 b =
2 temp =
0# 初始化邊界和臨時變數temp
for i in
range(3
,n +1)
:#使用for迴圈來表示遞推表示式
temp = a + b
a = b # 這裡將a後推了一位
b = temp # 這裡將b後推了一位
# 通過該迴圈可以完成遞推出f(n)的任務,且儲存在了temp中
f = temp
print
(f)#輸出答案
事實上,這是個通俗易懂的版本,你可能沒有很能感受到動態規劃的思想在其中,再看下面這一版本
n =
int(
input()
)if n <=2:
f = n
else
:
temp_list =[0
,1,2
]for i in
range(3
, n +1)
:-1]
+ temp_list[-2
])# 將前兩項的和加至列表末尾
f = temp_list[-1
]# 最後一項即是我們所需的答案
print
(f)
到這裡,你一定發現了這個問題的本質其實就是斐波那契數列好哥們看到了點乙個讚再走哇![](https://pic.w3help.cc/d9e/c9bd3170a5663b7c7e1bad1c65900.jpeg)
動態規劃 爬樓梯
假設你正在爬樓梯,需要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...