区间Dp

所谓区间dp,顾名思义就是在一段区间上的动态规划。它既要满足dp问题的最优子结构和无后效性外,还应该符合在区间上操作的特点。我的理解是往往会对区间进行合并操作。抑或是单个元素(可看成一个小区间)跨区间进行操作。例如括号匹配问题,石子合并问题(通过多次的相邻合并,最后实质上会产生跨区间的合并,如果你把其中的石子看作参考系的话就很容易感觉出来),还有在整数中插入运算符号的问题(利用运算符的优先级以及交换律可看出)

这样以来,如果我们要得知一个大区间的情况,由于它必定是由从多个长度不一的小区间转移而来(转移情况未知),我们可以通过求得多个小区间的情况,从而合并信息,得到大区间。

对于一个长度为n的区间,确定它的子区间需要首尾两个指针,显然子区间数量级为n2,那区间dp的复杂度也就为n2

递推式一般由小区间推到大区间,所以第一层循环一般是区间长度,第二层循环是区间起点。

1 for(int len = 1; len < m; len++)//区间长度
2 {
3     for(int start = 0; start + len < m; start++)//区间起点
4     {
5         int end = start + len;//区间终点
6         //递推式......   
7     }
8 }   

 

posted @ 2018-04-14 13:23  _努力努力再努力x  阅读(185)  评论(0编辑  收藏  举报