[總結-動態規划]經典DP狀態設定和轉移方程


馬上區域賽,發現DP太弱,趕緊復習補上。

#普通DP

CodeForces-546D Soldier and Number Game 篩法+動態規划

待補

UVALive-8078 Bracket Sequence

問以每個字符為左端點的最長括號序列是多長。(包括尖、花、中小括號)
狀態:設dp[i]為從i開始的括號序列最長長度。
轉移:以i+1為起點的最長串后邊的字符若與左括號匹配,答案是加上這個字符后邊的最長串,否則為零。

HDU-1024 Max Sum Plus Plus

給一個序列,找m個不重疊的連續子串,使這幾個子串內的元素和的和最大。
即sum(i1, j1)+sum(i2, j2)+...+sum(im, jm)最大
狀態:dp[i][j]表示選擇第i個元素,當前是第j個子串。
轉移:dp[i][j]=max(dp[i-1][j], dp[k][j-1])+num[i], (k<=i-1)
優化

  1. 維護max(dp[k][j-1])
  2. 滾動數組去掉第一維

HDU-4055 Number String

給一個序列相鄰元素各個上升下降情況('I'上升'D'下降'?'隨便),問有幾種滿足的排列。
例:ID
答:2 (231和132)
狀態:dp[i][j]表示滿足以j為結尾的,長度為i的排列方案數。
轉移
str[i]'I': dp[i][j]=sum(dp[i-1][k]) (1<=k<=j-1)
str[i]
'D': dp[i][j]=sum(dp[i-1][k]) (j<=k<=i)
str[i]=='?': dp[i][j]=sum(dp[i-1][k]) (1<=k<=i)

HDU-5009 Paint Pearls

給一串序列,可以任意分割多次序列,每次分割的代價是被分割區間中的數字種數。
求分割區間的最小代價。n<=5e4
例:1 3 3
答:2
狀態:dp[i]表示從0到i序列的分割代價。
轉移:dp[i]=min(dp[j]+cnt[j-1][i]^2)
優化:雙向鏈表刪除元素,優化掉j的選擇

UVA-11584 Partitioning by Palindromes

給一個字符串序列,問回文串的最少個數。
例:aaadbccb
答:3(分為aaa, d, bccb三份)
狀態:dp[i]表示從0到i的回文串最少個數
轉移:dp(i)=min( dp(j-1)+1 | [j, i]是回文串 )
優化:預處理回文串,復雜度降至O(n^2)

#區間DP

HYSBZ-1566 管道取珠

題意相見 https://www.cnblogs.com/tanglizi/p/9489073.html
當面對\sum a^2的時候,把情形分成兩種。當這兩種情景(狀態)相同時,方案數即為a^2。
狀態和方程待補。

LightOJ-1422 Halloween Costumes

想參加聚會,每場聚會需要穿對應的衣服。
現在有需要參加的聚會的衣服序列。
對策是可以穿着多件衣服,按聚會不同脫下即可;或者直接在當前衣服上在加一件衣服。
問最少穿過幾件衣服。
狀態:dp[i][j]為第i到第j聚會的穿衣最小數。
轉移:dp[i][j]=min(dp[i][k]+dp[k+1][j-1]), dp[i][j]=dp[i][j-1]+1

UVA-1331 Minimax Triangulation

三角剖分系列。
給一個任意多邊形,把它分為多個三角形。
求某方案中最大的三角形是各方案中最小的面積的三角形面積。
狀態:dp[i][j]為從i到j順時針區間的多邊形最小方案的值。
轉移:dp[i][j]=min(dp[i][j], max(Area(i, k, j), dp[i][k], dp[k][j]))

HDU-5693 D Game

待補好題

UVA-10003 Cutting Sticks

有根棍子,上面有些分割點(n<50),每次按分割點切割棍子時,費用為當前棍子的長度。
問有什么樣的順序切完分割點,使總費用最小。
狀態:dp[i][j]表示分割點ij之間棍子的最小切割費用。
轉移:dp[i][j]=min(dp[i][k]+dp[k+1][j])+pos[j]-pos[i]

ZOJ-3537 Cake

三角剖分系列。
給一個多邊形,需要分成若干三角形,且每分一次邊有代價|xi+xj|*|yi+yj|%p。
問總代價最小值。
狀態:dp[i][j]表示第i節點到第j節點圍城的多邊形最小值。
轉移:dp[l][j]=min(dp[l][k]+dp[k][j]+cost(l, k)+cost(k, j));

三角剖分邊界:dp[i][j]=INF, dp[i][i]=dp[i][i+1]=0
三角剖分原理:dp(i, j)(包含點ij且i<j)表示順時針從i到j的凸多邊形最值,則ijk可表示三角形頂點。

POJ-1651 Multiplication Puzzle

矩陣鏈乘問題
給一個序列,每次取一個元素的代價是c[i-1]c[i]c[i+1],問取到剩下2個元素的代價最小值。
狀態:設dp(i, j)表示i到j的元素全部選擇后的最小值,要注意是全部元素沒有被選擇過,且端點左右的元素沒有被選過
轉移:dp(i, j)=min(dp(i, k-1)+dp(k+1, j)+c[l-1] * c[k] * c[r+1])
注意

  1. k的取值范圍,按定義來就是i~j
  2. 為何狀態轉移是取k,而其他兩數在端點?
    我們可以證明,這樣的狀態轉移包含了所有取數情況,而取(k-1, k, k+1)(先取k元素)是明顯不可行的,
    因為接下來區間端點代價計算就是錯誤的。
  3. 邊界條件問題,我們一定要分析區間有0, 1, 2, 3個值的情形。我們發現l>r時,即上次的k選擇在了端點上,這部分代價在上一層已經計算完畢。l==r時,按定義發現只能有一種三元組。

POJ-2955 Brackets

給一個可能合法的括號序列(包含中小括號),問最長合法子串最長長度。
貌似可以用簡單dp的方法?
狀態:dp[i][j]表示i到j的最長長度。
轉移
dp[i][i+len]=max(dp[i][i+len], dp[i][k]+dp[k+1][i+len])
dp[i][i+len]=max(dp[i][i+len], dp[i+1][i+len-1]+2*ismatch(i, i+len))

以下待補:

#概率DP

#樹形DP

#數位DP

#背包問題

#典型DP


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM