区间dp
银之夏雪
这个作者很懒,什么都没留下…
展开
-
poj2955Brackets区间dp(括号匹配)
首先考虑怎么样定义dp让它满足具有通过子结构来求解、 定义dp [ i ] [ j ] 为串中第 i 个到第 j 个括号的最大匹配数目 那么我们假如知道了 i 到 j 区间的最大匹配,那么i+1到 j+1区间的是不是就可以很简单的得到。 那么 假如第 i 个和第 j 个是一对匹配的括号那么dp [ i ] [ j ] = dp [ i+1 ] [ j-1 ] + 2 ; 那么我们只需要从小到原创 2016-04-25 20:02:29 · 488 阅读 · 0 评论 -
poj1141Brackets Sequence(区间dp括号匹配打印路径)
这道题困扰了我一阵,因为之前只会求最大匹配,不会打印路径,后来发现用递归可以实现,首先我们知道前面定义dp [ i ] [ j ] 为串中第 i 个到第 j 个括号的最大匹配数目那么假如我们知道任意 i 到 j 从哪儿插入分点使得匹配添加括号最少。那么我们定义pos【i】【j】表示 i 到 j 从哪儿分开使得匹配添加括号最少,如果i和j匹配我们可以让pos【i】【j】=-1;我们发现在我们之前更新d原创 2016-04-26 11:29:47 · 420 阅读 · 0 评论 -
light oj 1031(区间dp+博弈)
这个题目后面的套路跟石子归并写的差不多,然而这里存在一个小的博弈,就是每次取得最优,dp[i][j] 表示在区间i~j上A比B多的分数值,由于二者都采取最优策略,故可以枚举i~j之间的的数k,取子区间i~k和k+1~j中的最大值(子区间的最大值表示B比A多的分数,因为A取完之后就要改B取了,也是最优的策略), 动态转移方程式为dp[i][j]=max(dp[i][j],max((sum[k]-s原创 2016-05-02 15:42:42 · 308 阅读 · 0 评论 -
51nod1021石子归并(区间dp)
#include <iostream>#include <stdio.h>#include <string.h>using namespace std;int n;int a[205],sum[205];int dp[205][205];//数组差不多得开大一倍const int INF=0x3f3f3f3f;void init(){ memset(dp,0,sizeof(原创 2016-04-19 15:06:34 · 1073 阅读 · 0 评论 -
nefu1130Attack monsters(区间dp)
这道题目让我改错误改了很久,但其实就是一道模板题稍稍变了个型,还有一点就是这个题是乱序的,需要排个序 下面是没优化的代码#include <iostream>#include <string.h>#include <stdio.h>#include <algorithm>using namespace std;int n,l;int sum[305];int dp[305][305]原创 2016-04-20 14:47:07 · 307 阅读 · 0 评论 -
51nod 1022 石子归并 环形+四边形优化
#include <iostream>#include <string.h>#include <stdio.h>using namespace std;int n;int a[2005];int dp[2005][2005],sum[2005][2005],s[2005][2005];//这个地方要注意啊,要开成2nconst int INF=0x3f3f3f3f;void init原创 2016-04-21 20:03:17 · 483 阅读 · 0 评论