學習ACM之動態規劃

2021-06-17 18:34:48 字數 2331 閱讀 4108

分類: acm演算法

2011-06-16 22:15

145人閱讀收藏 

舉報themes

優化遊戲

通過上一章的學習,相信大家對動態規劃已經有了乙個初步的了解,如果您將上一章的推薦習題全部掌握,那麼您可以開始這一章的學習內容了。

這一章,我們將講解一些動態規劃的設計技巧。

相信大家在做動態規劃一類題目的時候,往往不容易看出來這道題目是動態規劃。其實這並不是您的iq低,幾乎所有的初學者都會存在這樣的問題,我同樣也不例外,不過憑藉我超人的天賦,終於總結出來如何看出來某道題是不是動態規劃的終極方法:

做題做題在做題!在一年半的學習中,我深刻的體會到了:動態規劃是做出來的!這個硬道理,沒有題目數量的保證,學好動態規劃是很困難的。

但是動態規劃也並非是無章可循,下面就為大家介紹幾種常見的型別:

1.極值問題

這類問題的顯著特徵就是讓您求出最x值,並且往往具有最後子結構的性質,因為其模型變化豐富,並且和實際聯絡緊密,所以在動態規劃類問題中占有很大的重量

2.總數問題

3.一類博弈問題

4.某些雜題

一般情況下,動態規劃類的問題往往就這幾種型別,因此當大家看到以上幾種型別的時候,不妨向動態規劃的方向作些思考。

學習動態規劃的另乙個難點就是狀態的設計,可以說,只要有了狀態,那麼決策和階段也就迎刃而解了。

乙個好的狀態,首先要把問題描述清楚,其次轉移的時候應當盡量「簡單」,這裡的簡單,主要指狀態之間的「距離」,譬如a[i]=max(a[j]) j<=i就沒有a[i]=a[i-1]好。

下面讓我們看一道題目:

例:排隊買票

問題描述:一場演唱會即將舉行。現有n(o〈n〈=200〉個歌迷排隊買票,乙個人買一張,而售票處規定,乙個人每次最多只能買兩張票。假設第i位歌迷買一張票需要時間ti(1〈=i〈=n〉,隊伍中相鄰的兩位歌迷(第j個人和第j+1個人)可以由前乙個人買兩張票,也可由後一位買兩張票,則另一位就可以不用排隊了,則這兩位歌迷買兩張票的時間變為rj,現給出n,tj和rj,求使每個人都買到票的最短時間和方法。

因為可以從前乙個人買票,又可以從後乙個人買票,似乎不符合無後效性的原則,沒有辦法用動態規劃求解。

所以我們不妨採用加一維的策略:

設f(i,**)為到第i個人為止所需的最短時間.

設ti為第i個人單獨買票的時間。

設 ri為第i個人買2張票的時間。

則:狀態轉移方程分5種情況:

f(i,僅買1張)=min+ti

f(i,買2張代前一位)=min+ri

f(i,買2張代後一位)=min+ri

f(i,不買由前代)= f(i-1,買2張代後一位)

f(i,不買由後代)=min

注:本題的狀態還可以繼續優化到3種,請大家自己思考。

從上面的例子我們可以看到,當遇到題目的狀態無論如何也無法免除後效形時,可以採用加一維的方法來解決,有的時候甚至需要加兩維甚至三維。

處理動態規劃時還有幾種技巧:

1.對於一些需要計算出權函式的題目,不妨把函式的計算放置到動態規劃之外,同時還可以嘗試對一些權函式進行合併,這類處理權函式的技巧還有很多,相信大家在做題的過程中都會遇到,就不再詳細展開了

2.對於某些狀態,不妨對約束條件加以寬鬆,往往會起到出其不意的效果。

3.可以採用迴圈陣列技術,比較經典的應用就是上一章的數字三角形,因為只和上一層的狀態有關,和其他的狀態無關,所以不妨只儲存上一層的結果,每次計算出新的結果後就把上一層的結果捨棄,這樣會讓空間複雜度大大降低,是非常有用的一種優化方法。

4.採用狀態壓縮技術,這個優化的應用較為複雜,變形很多,有興趣的不妨在網上查詢相關資料

<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>

推薦題目:

1.數字三角形(採用迴圈陣列)

2.金明的預算方案(noip2023年提高組試題)

3.基因重組

4.數的劃分

5.免費餡餅

6.卡車更新

7.三維最大數字和

8.花店櫃檯布置

9.積木遊戲

10.musical themes(usaco 5.1.3)

11.buy low,buy lower(usaco 4.3.1)

12.rectangular barn (usaco 6.1.2)

本章內容看似簡單實則很難,僅僅是以上幾個題目是不夠的,而且幾乎所有的動態規劃試題都可以作為本章的練習,所以大家在做完上面的題目後不妨多找一些題目練習

ACM學習筆記 動態規劃

01揹包的特點 物品只有一件,可以選擇放或者不放。問題 有n件物品和乙個容量為v的揹包。放入第i ii件物品耗費的費用是c ic i ci 得到的價值是w iw i wi 求解將哪些物品裝入揹包可以使物品的價值總和最大。思路 把整個問題,拆分成幾個子問題。則面對第i ii個物品時,只需要考慮放或者不...

acm 動態規劃

學習參考 就是倒推 尋找遞推式 難點 然後用陣列將資料計算出來 最後直接呼叫得到答案 01揹包問題 for i 0 i 例題一 洛谷oj 開心的金明 include include using namespace std const int max 100001 long long dp max i...

acm之動態規劃題目3

在講述dp演算法的時候,乙個經典的例子就是數塔問題,它是這樣描述的 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?已經告訴你了,這是個dp的題目,你能ac嗎?輸入資料首先包括乙個整數c,表示測試例項的個數,每個測試例項的第一行是乙個整數n 1 n...