演算法競賽入門經典 Dynamic Programming,dynamicprogramming
111 - History Grading LCA
103 - Stacking Boxes DAG最長路
10405 - Longest Common Subsequence LCA
674 - Coin Change 完全背包求方案數
UVA 116 簡單遞推 輸出字典序最小解 從後往前推
10130 - SuperSale 01背包
531 - Compromise LCA
10465 - Homer Simpson 完全背包
10285 - Longest Run on a Snowboard 滑雪 經典記憶化搜尋
437 - The Tower of Babylon 最長上升序列 LIS
10404 - Bachet's Game 完全背包
?620 - Cellular Structure
825 - Walking on the Safe Side 直接左上到右下
ACM動態規劃問題(演算法競賽入門經典)
遞迴就不說了,明顯是需要棧的邏輯結構維護的。簡單說說對遞推和DP的個人見解,只供參考。
DP=狀態+狀態轉移方程
狀態的關鍵特點是無後效性,簡單地舉例:奧運會某項目淘汰賽1/N決賽,成績只跟以後的比賽有關,之前的成績不帶入(只考慮賽制)。如果你發現一個狀態後面階段決策需要用到前面階段的狀態資訊,那麼這就不是一個標準的DP。比如:
A - B1 - C1 - D
\-- EX ------/
如果將EX歸為B段或C段,那麼EX-D或者A-EX就跨越了跳躍了一個階段,對於這個階段來說他後面的階段就用到了前面階段的狀態資訊
當然這並不意味著不能採用DP演算法,對於上面的例子,可以將EX本身拆為B2 - C2就可以滿足DP條件了,對於連續狀態的DP,類似的調整更多。
狀態轉移方程是狀態到狀態的決策
簡單地說,就是貪心的那一部分,多條路你選擇一條路的過程
很多時候,遞推和DP難以區分,一般情況,狀態轉移決策明顯是“選擇”的時候,會當做DP,而如果計算比重較大,會當做遞推;狀態調整比較多時,可能認為是遞推;連續狀態可以歸為DP。
例:M*N的的帶權格子,從左上走到右下,每次只能向右或下移動一格,求權值加和最大(小)的路徑條數。
還有一個相關詞叫做“遞推規劃”,有興趣的話可以自己看下相關資料
解釋之後答案很明顯:DP要有狀態轉移方程。甚至可以說DP的關鍵就是狀態轉移方程。
你的第一個問題,希望你把書名報一下,我貌似沒有白皮的
演算法競賽入門經典怎
從書本的編排上,就可以看出作者的確是用心在寫書。比如講,動態規劃一章,在介紹各種動態規劃基本問題時,我目前見過的所有演算法書都只給出最優值的那個值,而沒有考慮到競賽或其它需要時,對答案構造的需要。比如,如果一個題目真要你輸出字典序列最小的方案,可能會難倒很多人。而真正靠初學者自己要來領悟這樣一些方法,確實是需要不少時間的。諸如此類的用心書中還有很多,作者一個個演算法娓娓道來,卻又在初學者容易犯錯的地方給一些提示,感覺很好。 更難能可貴的是,作者作為ICPC WORLD FINAL銀牌得主,資訊學國家隊教練,絲毫沒有架子,不會像高數、數分書上那麼多“顯然”、“很容易看出”之類直接來一個例子。但是,這並不說明行筆羅嗦,相反,更體現作者心思細膩,真去PKU做兩個題目就會發現,很多時候演算法正確是一方面,細節上不出錯又是一個方面,把"=="打成"="然後調一個多小時代碼,絕對是初學語言的時候常犯的錯誤。 但是,整本書沒有任何參考書目附於附錄,一來是對被參考書籍的作者的不尊重,二來不利於讀者進一步閱讀(比如動態規劃一章之後的習題推薦,基本全部來自於《programming challenge》一書的習題)。 總起來說,本書絕對值得一讀,即使是有演算法基礎的ACMER||OIer 期待後續兩本著作問世