区间DP
母题
令 \(f[i,j]\) 表示区间内的信息。
考虑转移就是 \(f[i,j]=f[i,k]+f[k+1][j]+merge([i,k],[k+1,j])\),merge 可以用前缀和。
\({1,2,3}\in\) 动态规划的题目(CSDN)
1(NO.4)
考虑若两端点相等,那么可以连着,即 \(a_i=a_j,f[i][j]\leftarrow f[i+1][j-1]\),还有一种情况类似于上面的直接劈开。
2(NO.5)
比较麻烦,类似于母题,但是需要加一些特殊处理,而且边界。
3(NO.69)
转移有很多。
首先如果 \(s[i]==s[j]\),你可以考虑 \(f[i][j]\leftarrow f[i+1][j],f[i][j-1],f[i+1][j-1]+1\)(前两个必选一个,最后一个可选可无)。
其次就是类似于母题的转移。
对于上面那个,可以理解为覆盖的顺序是可以灵活调动的,而第三个并不符合这一点。
AcWing 479. 加分二叉树
这道题是区间DP的灵活运用,表示的是中序遍历对应的区间,众所周知,中序遍历最中间的是根,而且加分时也是以根为分界计算的,所以划分依据就是根的位置。最后通过枚举根的位置划分,dfs找的过程复杂度为 \(O(n^2)\)(每次找一个根是 \(O(n)\))。
P4563 [JXOI2018] 守卫
误导性极强,但是答案的求解是区间,所以是区间DP,右端点不断右移,左端点往回扫。
上下序列
设计很一般,还是考虑每次新加入两个数与 \([l,r]\) 的关系比较、两个数需要相等,重点在于转移的条件(比较繁琐,要逐个检查 \(k\) 个,因此设计函数)。
CF149D
状态:基本信息+题目要求的三种颜色
转移:
- 边界,\(l+1=r\)。
- 包含。
- 并列。
括号序列
CF149D对本题有借鉴意义,转移、状态有一定相似度。我们需要考虑用状态存储几种类型的字符串,然后才能转移,而且转移还要分类在这几类中互相转化。
A 魔力屏障
状态:基本状态+考虑到法力值小加入状态中。
转移考虑两次能量波的使用,合并区间,故用区间DP。
洗车
状态设计上考虑到如果那样设计会出现反悔,所以修改状态。由于会选择这些店中最便宜的一个进行一次消费,所以状态里会增加一维最小值。合并区间时是 \([l,p-1],\{p\},[p+1,r]\)。
51nod-3972-战斗队形
本题关键在于如果基本状态交换信息就不能存储,很麻烦,所以我们存储最值,这样就可以方便的往左边和右边扩展,或者同时往两边推进,交换。
总结
左端点倒着枚举,右端点顺着枚举可以保证大区间用到小区间信息时都已经求出
区间 DP,状态必须有区间,基本的题都有边界的处理(如1,3中相等的情况,2中一匹、两匹,以及1,2中合并的处理),当然必不可少的是区间的合并。
发现小区间的答案可以转移到大区间,如果转移可以分类就要分类转移,如果边界的类型不同,可能需要增加一维记录类型。划分点可以是在区间上的,也可以树上的根节点,反正都是中间的部分。
答案求解或者某个点会有提示。
最优解可能用到贪心思维。
状态里除了区间信息如果不够需要增加其他维度,大部分情况下只需要记录区间信息,且普遍复杂度为 \(O(N^3)\)。
难度在于答案的计算或者答案转移的条件判断。
括号序列的题关键:并列、包含两种关系分类转移。
合并区间时有包含当前点(属于左区间或右区间)、当前点单独一部分、刨除当前点的情况,具体情况具体分析。

浙公网安备 33010602011771号