DP 題集 2

關於 DP 的一些題目php


  • String painter 先區間 DP,\(dp[l][r]\) 表示把一個空串塗成 \(t[l,r]\) 這個子串的最小花費。再考慮 \(s\) 字符串,\(f[i]\) 表示前 \(i\) 個字符相同時的最小花費。
  • Parade 單調隊列優化 DP。
  • Free Goodies 對於第一我的,她選擇的順序是固定的。第二我的想要選到全局最優,那麼有 \(dp[i][j]\) 表示到第 \(i\) 個數時,選了 \(j\) 個數時的最大值,順便再記錄下第一我的選的最大值。
  • Help Bubu 狀態壓縮 DP,有 \(dp[i][j][k][s]\) 表示到第 \(i\) 本書時,拿了 \(j\) 個出來,最後一本書的高度爲 \(k\) ,書的高度的狀態是 \(s\) 的最小混亂程度,計算最終答案時,對於拿出來的書,只有狀態中沒有對應的高度纔會形成混亂度增長。
  • Caves 樹形 DP ,距離值太大,可是點數很小,考慮 \(dp[i][j][k]\) 表示以 \(i\) 爲根結點的子樹 ,從 \(i\) 出發走了 \(j\) 個點,是否 ( \(k=0\ or\ 1\) ) 回到根結點的最短距離。
  • Masud Rana 狀態壓縮 DP ,指望 DP 。\(dp[S]\)\(S\) 轉化成二進制後 0/1 表示某個點是否被走過,那麼顯然走過點都在一個聯通塊裏,考慮下一次走到一個新的點(擴展聯通塊),仍是仍然在聯通塊裏,累加指望便可。
  • Fund Management 狀態壓縮 DP 。首先,僅僅記錄有哪些股票是不夠的,考慮手數,很差設計狀態。能夠預處理狀態轉移,即從一種股票組合是否能經過買或賣到另外一種股票組合(這樣就不用管有哪些股票,有幾手股票了)。
  • Evacuation Plan 先分別排序,而後有 \(dp[i][j]\) 表示前 \(i\) 我的分配到前 \(j\) 個避難所的最小花費。滾動數組優化,記錄方案能夠用 bool 類型的數組。
  • Exclusive Access 2 經典模型:圖的色數。 給一個無向圖 \(G\) ,把圖中的結點染成儘可能少的顏色,使得相鄰節點顏色不一樣,能夠用狀態壓縮 DP 求解。回到這題,其實是給出一個無向圖,要求給無向邊定向,使其無環且最長路最短。考慮給結點分層,要求每一層的結點之間沒有邊,那麼最小層數即爲圖中的最長路加1 ,對於具體的邊的定向,編號小的層中的結點的向編號大的層中的結點連邊。分層實際就變成了圖的色數問題,過程當中記錄下分層的方案便可。
  • Mountain Road \(dp[i][j][k]\) 表示最後一個走的車是 \(k\) 這邊的,\(A\) 邊的車走了 \(i\) 輛,\(B\) 邊的車走了 \(j\) 輛時的最小花費。
  • Interstellar Travel 利用分塊的思想優化,\(dp[d][i][j]\) 表示 \(i\)\(j\) 通過 \(d\) 條邊的最短距離,\(f[d][i][j]\) 表示 \(i\)\(j\) 通過 \(100*d\) 條邊的最短距離,對於詢問邊數 \(d\),顯然能夠表示成 $ ( d%100, d/100) $ ,由於求的是至少 \(d\) 條邊,因此再預處理下, \(g[d][i][j]\) 表示 \(i\)\(j\) 的通過了至少 \(d\) 條邊的最短距離。對於詢問,枚舉中間點 \(k\) ,$ min(f[d/100][s][k] + g[d%100][k][t]) $ 即爲答案。
  • Random Sequence \(dp[i][j][k][p]\) 表示到第 \(i\) 個數,\(j=gcd(a[i-2], a[i-1], a[i])\), \(k=gcd(a[i-1],a[i])\), \(p=a[i]\) 時對答案的貢獻。實際合法的狀態不多,預處理下便可。
  • Hills And Valleys 預處理以某點開始或結尾的最長上升子序列長度,而後枚舉要翻轉的區間的值域 \([l,r]\) , 在這個約束下轉移,實際上咱們要肯定的就是某個降低的子序列的起點和終點,轉移的時候記錄下起點,對於每一個數都判斷下是否可能爲終點便可。
  • Shoot Game 對於每一個線段,向端點射擊顯然最優,再就是對於一個區間中的全部線段,最大權值的線段先射擊必定不壞,考慮區間 DP ,將射擊指向的方向按極角排序,區間 DP 的時候,對於一段區間,只須要考慮徹底包含在這個區間中的線段。
  • Histogram Coloring 計數 DP ,遞歸實現很方便 。
  • Moving to Nuremberg 樹形 DP 。經典模型,統計樹中全部結點到某個結點的距離,本題中,能夠把每一年要去某個點的次數看做這個結點的 \(size\)
  • Binary Strings 矩陣快速冪優化 DP 。等比矩陣求和。
  • 度度熊看球賽 應該算是比較經典的 計數 DP 了。\(dp[i][j]\) 表示前 \(2*i\) 我的,有 \(j\) 對情侶是挨着坐的方案數,考慮新來的兩我的,要麼坐一塊兒,要麼分開坐,要麼拆散別人,要麼不拆散。預處理下便可。
  • Dinner Bet 機率 DP 。\(dp[i][j][k]\) 表示獨屬於第一我的的數字已經填了 \(i\) 個,獨屬於第二我的的數字已經填了 \(j\) 個,兩人共有的數字填了 \(k\) 個時的還要進行的遊戲輪數的指望。記憶化搜索,暴力枚舉每次選 \(d\) 個數字的組合,而後轉移便可。在轉移的時候要考慮一個對狀態有影響的數字都沒選到的狀況,\(dp = p0 * dp + p1 * dp1 + p2 * dp2 ....\) 能夠經過移項變換成 $ dp = \frac{p1 * dp1 + p2 * dp2 + ....}{1 - p0} $ 。
  • 公共子序列 考慮隨機生成的數列有什麼性質,相同的數必然不多,考慮經典的 LCS 是怎麼轉移的,只有全部序列中有相同的數字 ( 比方說 $a_i=b_j=c_k $ 咱們稱 \((i,j,k)\) 爲一個狀態 ),才能從前面轉移過來,預處理全部這樣的狀態。狀態總數不會不少,幾乎是 \(n\) 的級別,再 \(O(n^2)\) DP 便可。
  • 棋盤上的旅行 先考慮棋盤上只有 \(k\) 種顏色的狀況,直接狀態壓縮 DP ,\(dp[S][x][y]\) 。可是棋盤顏色不少,怎麼辦?不妨壓縮顏色的值域,全部顏色都對應到 \([1,k]\) (隨機化),而後直接 DP 便可,考慮單次的正確性,\(\frac{k!}{k^k}\) (也就是咱們選到的顏色剛好是一個排列),\(1000\) 次能夠確保經過本題。
  • Pop the Balloons 狀態壓縮 DP 。\(dp[i][S]\) 表示到第 \(i\) 列,已經爆炸的行數狀態爲 \(S\) 的方案數。這裏會有一個問題,一個氣球可能被同列的氣球炸到,也有可能被同行後面的氣球炸到,也就是說,存在決策,某一列一個氣球都不炸,這樣二進制就表示不了狀態了。可是考慮每行最多隻會炸一次,最外層的循環,能夠枚舉全部必然爆炸的行的狀態 \(S\) (也就是說,咱們假定這些行必定爆炸),一行爆炸後,後面的氣球不再能引爆了,因此在狀態轉移的時候,到某一列,全部存在的氣球的狀態,只有沒爆炸過的氣球纔會爆炸,最後的結果就是 \(dp[n][S]\) ,時間複雜度 \(O(nm3^m)\)。經過暴力枚舉,創建約束,優化了 DP 的狀態表示。
  • Fibonacci Subsequence 考慮從後往前 DP ,\(dp[i][j]\) 表示知足條件的序列倒數第二項是 \(a[i]\) ,最後一項是 \(a[j]\) 時的最大長度。找到 \(a[k]=a[i]+a[j]\)\(k\) 來轉移。
  • Wrap Around 預處理 \(nxt[i][j]\) 表示模式串中長度爲 \(i\) 的前綴串後面加個 \(j\) 後匹配到的最長前綴串的長度。\(dp[i][j][k][ok]\) 表示到長度 \(i\) 時,匹配了前綴長度爲 \(j\) ,初始狀態爲 \(k\) ,是否出現過模式串的方案數。這裏巧妙的地方在於咱們枚舉初始狀態 \(k\) ,最後要回到初始狀態,即當 \(i=n\)\(j=k\) 以及 \(ok=1\) 時才獲得一個合法的方案。
  • Vasya and Big Integers 首先 Z-function\(dp[i]\) 表示 \(s[i...n]\) 能夠表示出的合法的方案數。若是兩個數字長度相同,那麼從左到右第一位不一樣的數字就能夠肯定大小。預處理 \(z[i]\) 表示從 \(i\) 開始的字符串與原字符串的最長公共前綴長度,咱們能夠肯定能夠從哪些 \(dp[j] (j>i)\) 轉移過來,即 \(s[i..j-1]\) 這個子串表示的數字在 \([l,r]\) 之間,這個利用後綴和優化。
相關文章
相關標籤/搜索