赞
踩
区间dp顾名思义就是在一个区间上进行的一系列动态规划。对一些经典的区间dp总结在这里。
1) 石子归并问题
题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=737
描述: 有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。
分析:要求n个石子归并,我们根据dp的思想划分成子问题,先求出每两个合并的最小代价,然后每三个的最小代价,依次知道n个。
定义状态dp [ i ] [ j ]为从第i个石子到第j个石子的合并最小代价。
那么dp [ i ] [ j ] = min(dp [ i ] [ k ] + dp [ k+1 ] [ j ])
那么我们就可以从小到大依次枚举让石子合并,直到所有的石子都合并。
这个问题可以用到平行四边形优化,用一个s【i】【j】=k 表示区间 i---j 从k点分开才是最优的,这样的话我们就可以优化掉一层复杂度,变为O(n^2).
代码:
平行四边形优化代码:
2)括号匹配
题目链接:
poj2955,http://poj.org/problem?id=2955
nyoj 15 http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=15
描述:给出一串的只有‘(’ ‘)’ '[‘ ']'四种括号组成的串,让你求解需要最少添加括号数让串中的所有括号完全匹配。
分析:我们求出这个串的最大匹配,然后串的总长度-最大匹配就是答案。
方法1:首先能想到的是转化成LCS(最长公共子序列),枚举中间点,求所有的LCS中的最大值 * 2就是最大匹配。但是复杂度较高,光LCS一次就O(n^2)的复杂度。
方法2:
首先考虑怎么样定义dp让它满足具有通过子结构来求解、
定义dp [ i ] [ j ] 为串中第 i 个到第 j 个括号的最大匹配数目
那么我们假如知道了 i 到 j 区间的最大匹配,那么i+1到 j+1区间的是不是就可以很简单的得到。
那么 假如第 i 个和第 j 个是一对匹配的括号那么dp [ i ] [ j ] = dp [ i+1 ] [ j-1 ] + 2 ;
那么我们只需要从小到大枚举所有 i 和 j 中间的括号数目,然后满足匹配就用上面式子dp,然后每次更新dp [ i ] [ j ]为最大值即可。
更新最大值的方法是枚举 i 和 j 的中间值,然后让 dp[ i ] [ j ] = max ( dp [ i ] [ j ] , dp [ i ] [ f ] + dp [ f+1 ] [ j ] ) ;
如果要求打印路径,即输出匹配后的括号。见http://blog.csdn.net/y990041769/article/details/24238547详细讲解
代码:
3 )题目链接:Brackets Sequence
题目描述:给出一串由‘(‘)’‘ [ ' ' ] '组成的串,让你输出添加最少括号之后使得括号匹配的串。
分析:是区间dp的经典模型括号匹配。讲解:http://blog.csdn.net/y990041769/article/details/24194605 ,难点在于要把匹配后的括号输出来。
首先我们知道前面定义dp [ i ] [ j ] 为串中第 i 个到第 j 个括号的最大匹配数目
我们发现在我们之前更新dp [ i ] [ j ] 的时候如果中间点k使得if ( dp [ i ] [ k ] + dp [ k+1 ] [ j ] >= dp [ i ] [ j ] ) ,那么我们从k分开可以让添加的括号最少。
但是还要注意一点,考虑所有的都不匹配如“((((”这类,考虑怎么处理,然后就可以递归输出结果。
这题目坑了我很多次,刚开始Tel,发现全部不匹配不能处理,改了之后wa了。发现输入“()(()”,输出的是“(()()())”,明显错误,是在处理的时候没处理好,最后注意输入会有空串。
代码:
4)整数划分问题
题目链接:nyoj746 http://acm.nyist.net/JudgeOnline/problem.php?pid=746
题目描述:给出两个整数 n , m ,要求在 n 中加入m - 1 个乘号,将n分成m段,求出这m段的最大乘积
分析:根据区间dp的思想,我们定义dp [ i ] [ j ]为从开始到 i 中加入 j 个乘号得到的最大值。
那么我们可以依次计算加入1----m-1个乘号的结果
而每次放入x个乘号的最大值只需枚举第x个乘号的放的位置即可
dp [ i ] [ j ] = MAX (dp [ i ] [ j ] , dp [ k ] [ j-1 ] * a [ k+1 ] [ i ] ) ;
代码:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。