Problem#
給你一個整數陣列 cost[i] 代表踩第 i 階樓梯的花費,每次可以跨一階或是兩階,從 0 或是 1 開始踩,問到頂樓的最小花費是多少?
測資限制#
- 樓梯階數: $2 \le n \le 1000$
- cost 值: $0 \le val \le 999$
想法#
對於第 $i$ 階來說,要踩到這只可能來自於第 $i-1$ 或是 $i-2$ 階(因為一次只能踏 1 或 2 階),所以可以得出公式:
$$
f(i)=
\begin{cases}
\min(f(i-1), f(i-2))+cost[i], & i \ge 2 \cr
cost[i], & i \le 1 \cr
\end{cases}
$$
接著應很容易可以照式子寫出程式。
AC Code#
這邊還有先將 cost 的前後都加上 0。前面的 0 是為了讓 cost 變成 1-index 的(個人習慣)
而後面的 0 是讓最後一階包含沒踩到的可能性(可能是從 n-1 踏兩階沒經過 n 到達 n+1[終點]的)
且因為兩個 cost 都是 0 所以也不影響答案,只是方便撰寫程式。
- 時間複雜度: $\mathcal{O}(n)$
- 從左往右根據公式去建立 dp 陣列
- 空間複雜度: $\mathcal{O}(n)$
- 儲存 dp 陣列
心得#
這題一開始是用 Top-Down 去思考並實作出來,結果在大測資 TLE 了,試著用 memo 但是失敗,改成 Bottom-up 就過了
TODO: top-down dp
1 | class Solution { |