眾所周知在算法中,存在著一群元老級(jí)別難度的算法,比如:動(dòng)態(tài)規(guī)劃,dfs,貪心,分治等,近段時(shí)間在我長(zhǎng)時(shí)間的研究下,重要對(duì)此有了一點(diǎn)點(diǎn)了解,現(xiàn)在和大家分享一下
首先,在我看來,動(dòng)態(tài)規(guī)劃就是將一個(gè)題,分解為無(wú)數(shù)個(gè)子問題,并且這些子問題的算法,解題過程都是一樣的子問題。然后通過每個(gè)子問題找到對(duì)應(yīng)的遞推公式,最后得出最終的正確答案。
第二,我們需要搞清楚邊界條件,比如說什么時(shí)候開始,什么時(shí)候停止,這是一個(gè)重要的環(huán)節(jié),當(dāng)邊界調(diào)節(jié)設(shè)置錯(cuò)誤時(shí),這道題將全軍覆沒。
接下來,就是要確定實(shí)現(xiàn)方法:在我看來我一般習(xí)慣使用雙層for循環(huán)。
來舉個(gè)簡(jiǎn)單的例子:藍(lán)橋杯算法訓(xùn)練的拿金幣問題,我們到最下面那個(gè)格子,我們要拿到最多的金幣,因?yàn)樽詈笠粋€(gè)格子的金幣是固定的,所以我們只需要知道走到上一個(gè)位置所能拿到的最多的金幣即可,接著推,我們只需要找到走到這一個(gè)格子上一步能取到的最大值即可
最后不論我們?cè)趺醋?,最后總?huì)退到原點(diǎn),現(xiàn)在就是思路的轉(zhuǎn)換,從倒推到正著打代碼。
接下來,我們創(chuàng)建一個(gè)數(shù)組,記錄走到每一個(gè)格子可能拿到的最大值即可。這道題的邊界條件很簡(jiǎn)單,就是數(shù)組的0號(hào)位存儲(chǔ)第一個(gè)格子的金幣即可。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?