分類: 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...