动态规划 —— 区间 DP
【概述】
區間型動態規劃,又稱為合并類動態規劃,是線性動態規劃的擴展,它在分階段地劃分問題時,與階段中元素出現的順序和由前一階段的區間中哪些元素合并而來有很大的關系。
【思想】
區間 DP 實質上就是在一個區間上進行的動態規劃,不僅要滿足 DP 問題的最優子結構,還要符合在區間上操作的特點。
其主要思想就是在小區間進行 DP 得到最優解,然后再利用小區間的最優解合并求大區間的最優解。
往往會枚舉區間,將區間分成左右兩部分,再求出左右區間進行合并操作。這樣一來,如果要得知一個大區間的情況,由于它必定是由從多個長度不一的小區間轉移而來,那么可以通過求得多個小區間的情況,從而合并信息,得到大區間。
即:已知區間長度為 len-1 的所有狀態,然后可以通過小于 len 的狀態轉移到區間長度為 len 的狀態,一般是在外層循環遍歷 len,內層循環遍歷起點來解決。
for k:=1 to n-1 do ? ? //區間長度for i:=1 to n-k do ? ? //區間起點for j:=i to i+k-1 do ? ? //區間中任意點dp[i,i+k]:=max{dp[i,j] + dp[j+1,i+k] + a[i,j] + a[j+1,i+k]};狀態轉移方程:尋找區間 dp[i,i+k] 的一種合并方式 dp[i,j] + dp[j+1,i+k],使得其值最大或最小
區間長度 k 必須要放到第一層循環,來保證方程中狀態 dp[i,j]、dp[j+1,i+k] 值在 dp[i,i+k] 之前就已計算出來
其中 a[i,j]+a[j+1,i+k] 可以靈活多變,其指的是合并區間時產生的附加值
【模板】
區間 DP 中常見的題型,其基本都可以按照以下的套路來解決,只是不同的題設對應的狀態轉移方程不同。
此外,石子合并問題是區間 DP 中的經典模型,具體內容見:石子合并三講
int dp[N][N];for(int i=1;i<=n;i++)dp[i][i]=初始值for(int len=2;len<=n;len++){ //區間長度for(int i=1;i<=n;i++){ //枚舉起點int j=i+len-1; //區間終點if(j>n) //越界結束break; for(int k=i;k<j;k++) //枚舉分割點,構造狀態轉移方程dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+w[i][j]);} }【例題】
1.簡單區間 DP
2.石子合并
3.其他
總結
以上是生活随笔為你收集整理的动态规划 —— 区间 DP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 训练日志 2018.9.5
- 下一篇: 暑期训练日志----2018.8.17