区间dp
区间dp
概述
区间dp没有什么前置技能,思维难度跨度大,可以出现在NOIP或省选的小题里,需要熟练掌握。
区间dp往往用于处理互相嵌套的区间的问题,我们往往可以先把小的区间做好,然后让大的区间直接调用小区间的子问题进行dp
模式
区间断点
已知数列每个元素的代价和合并两个区间的代价,求整个区间的代价
从小到大枚举长度,再枚举起始点对于一个区间枚举其中的断点,进行操作
状态:f[i][j]=min{f[i][k]+f[k+1][j]+solve(i,j)}
dp复杂度:\(\Theta(N^3)\)区间延伸
区间每次只会编辑两端
从小到大枚举长度,再枚举起始点,每次根据向左端点或右端点延伸转移
状态:f[i][j][0]=f[i+1][j][]+f[i][j-1][]
dp复杂度:\(\Theta(N^2)\)字符串处理
例如求字符串压缩后的最小长度,需要对字符串中重复的部分进行操作
如上枚举区间,再枚举断点合并,再判断当前区间是否符合条件,进行操作
状态:f[i][j]=min{f[i][k]+f[k+1][j]+w(i,j),solve(i,j)}
,
例题
P1880 [NOI1995]石子合并
P1220 关路灯
P4170 [CQOI2007]涂色
P3205 [HNOI2010]合唱队
P4302 [SCOI2003]字符串折叠
P2470 [SCOI2007]压缩