這段時間學習了區間dp,所以試著把學到的東西稍作總結,以備不時之需。
學習區間dp首先要弄清區間dp是為了解決什麼問題:一般的dp主要是特徵是一次往往只操作乙個數值或者儲存可以不連續的物品的狀態(比如揹包問題中,每乙個點儲存的狀態中,拿到的物品的編號並不要求一定連續)而區間dp,則是要求dp陣列中每個點的狀態對映到原本的資料集中都會與附近的元素有所關聯,其中,連續區間的長度、起始點的位置、子區間分割點的位置都會有所變化,而這和一般的dp有所不同,故一般用區間dp。
區間dp的一般格式(參考部落格):
for(int l=1;l<=n;l++) //每次處理的區間的長度
for(int i=0;i+l-1
//每次區間的起點
int j=i+l-1; //
每次區間的終點
for(int k=i;k//
區間的分割點
//todo:狀態轉移方程
兩個個例題:
一.poj1561
ac**:
#include #include#include
using
namespace
std;
const
int maxn=105
;int
dp[maxn][maxn];
intnum[maxn];
intmain()
for(int l=2;l)}}
printf(
"%d\n
",dp[2
][n]);
return
0;
}
二.poj2955
ac**:
#include #include#include
using
namespace
std;
const
int maxn=105
;char
str[maxn];
intdp[maxn][maxn];
int check(char a,char
b)
if(a=='
['&&b==']'
)else
}int
main()
for(int l=3;l<=len;l++)}}
printf(
"%d\n
",dp[0][len-1
]);
}return0;
}
區間dp總結
持續更新 1.p1005 矩陣取數 解題思路 按行區間dpvoid print int128 x 部分 include include include using namespace std int128 map 85 85 f 85 85 int128 ans 0 按行區間dp int128 p ...
區間DP總結
做了幾題區間動態規劃的題目,覺得區間動態規劃的題目是有點難的。區間dp大概是這一類的動態規劃,在乙個線性的資料上對區間進行狀態轉移,dp i j 表示i到j的區間。dp i j 可以由子區間的狀態轉移而來,關鍵是dp i j 表示的是什麼,然後去找dp i j 和子區間的關係。要知道,在求dp i ...
蒟蒻 區間dp學習總結
例題 p1063 能量項鍊 p3205 hnoi2010 合唱隊 區間dp,顧名思義,在區間上dp,大多數題目的狀態都是由區間 類似於dp l r 這種形式 構成的,就是我們可以把大區間轉化成小區間來處理,然後對小區間處理後再回溯的求出大區間的值,主要的方法有兩種,記憶化搜尋和遞推。memset d...