動態規劃(Dynamic Programming) 動態規劃是一種有效率計算由子問題堆疊而成的演算法,是一種常見的解題方式。透過將問題分解成許多可以利用簡單方法解決的子問題,將其逐一解出並記錄,透過此方式來解答複雜的問題。其精神在於 「同樣的問題不要再算第二次」 ,而這樣的演算法也是在解決許多重疊子問題的複雜問題最有效。當遇到複雜計算的問題不知如何下手時,試著將問題動態規劃分解成一個個能夠解決的子問題,找到問題之間的規律,並且將解決後的答案記錄下來,在後續遇到需使用前一次計算出來的答案時就可以直接查表並給出答案。利用空間換取時間的解題方式,就是動態規劃。
範例說明
動態規劃中最經典的問題無非是爬階梯問題,總共有n階梯,一次最多能走一階或兩階,問你有多少種方式可以走到第n階?
問題:假設n=5,先將其拆解成:n=1.2.3.4.5四個子問題
n=1
解法:[ 1 ] ⇒ 1種
n=2
解法:[ 1, 1 ]、[ 2 ] ⇒ 2種
n=3
解法:[ 1, 1, 1]、[ 1, 2 ]、[ 2, 1 ] ⇒ 3種
n=4
解法:[ 1, 1, 1, 1 ]、[ 2, 1, 1 ]、[ 1, 2, 1 ]、[ 1, 1, 2 ]、[ 2, 2 ] ⇒5種
由上述四種拆解問題可得出:F(3)=F(2)+F(1)=2+1=3種、F(4)=F(3)+F(2)=3+2=5種,可以明顯看出,當今天要計算走到n階有多少種方式這個問題其實就是數學中的費氏數列問題:F(n)=F(n-1)+F(n-2),故當今天要計算n=5時只需將F(4)+F(3)=8,就可得知最多有8種方式可以走到第5階。
n=5
解法:[ 1, 1, 1, 1, 1 ]、[ 2, 1, 1, 1 ]、[ 1, 2, 1, 1 ]、[ 1, 1, 2, 1 ]、[ 1, 1, 1, 2 ]、[ 2, 2, 1 ]、[ 2, 1, 2 ]、[ 1, 2, 2 ] ⇒ 8種
優點:
缺點:
參考資料:
這篇很乾貨👍👍
謝謝您!若文章有任何知識錯誤或是太過簡短的部分都請指教,擔心文章所發內容不夠清楚明瞭。我會繼續努力!