区间dp
winhcc
这个作者很懒,什么都没留下…
展开
-
poj 2955
区间dp,给一个括号序列,求最长的合法的子序列的长度。 dp[i][j]表示[i,j]这段区间里面的最长子序列的长度,当s[i] =s[j] 是,可以转换位子问题:求[i+1,j-1]的最长合法子序列的长度,但是不能就直接求得,如 [][] , 可知答案应为4,但如果直接求得话就是2。 所以不管s[i] 和s[j] 是否相等,都要枚举中间得元素。 区间dp写成记忆化得时候一定要处理好边界情况。 #...原创 2019-03-25 17:33:32 · 206 阅读 · 0 评论 -
poj 1651
区间dp,给n个数,每次去除1个数,产生的费用是a[i-1]*a[i]*a[i+1],问最小的费用是多少。 记忆化搜索即可 #include<bits/stdc++.h> using namespace std; #define forn(i,n) for(int i = 0;i<int(n);i++) typedef long long LL; LL mod = 1e9 + 7...原创 2019-03-25 17:38:49 · 134 阅读 · 0 评论 -
LighOJ 1422
区间dp,dp[i][j]表示[i,j]的需要换的最小的衣服的件数,则若a[i] = a[j] , 则dp[i][j] = min(dp[i+1][j],dp[i][j-1]), 否则要加上1, 然后枚举中间的点,看能否构成更优的解。 记忆化大法好 ! #include <cstdio> #include <cstring> #include <algorithm&...原创 2019-03-25 19:59:49 · 114 阅读 · 0 评论 -
hdu 4283
n个人,每个人第i个选中时会产生一个值,为d[k] * (i-1),问全部选这n个人的最小的值。 区间dp,d[i][j]表示[i,j]里面的产生的最小的值,计算d[i][j]时可知[i,j]有j-i+1个人,可以枚举第i个人(区间最左边的人)是第第几个被选的。若是第k个被选中,则转化为两个子问题d[i+1][i+k-1],d[i+k][j],这一步产生的值为d[i] * (k-1 ) + (su...原创 2019-03-26 16:22:25 · 111 阅读 · 0 评论 -
Codeforces 1132F
给一个字符串,可以选择连续的一段字串删除,该字串中所有的字符都相等,问需要多少次才能删除整个字符串。 区间dp,dp[i][j]表示[i,j]要删除的次数,一次操作可以删i,也可以删j 当[i+1,j]中有和s[i]相同的字符时,就转化为两个子问题:[i+1,k-1],[k,j]; 写成记忆化比较方便啦 #include<bits/stdc++.h> using namespace s...原创 2019-03-30 17:35:48 · 232 阅读 · 0 评论 -
poj 1141
给一个括号序列,可以加括号,求使得其合法的最短的括号序列。 和poj 2955 相似,都是有关合法括号序列,还是区间dp,d[i][j] 表示使得[i,j]合法的最小花费。 然后还要打印处理后的括号序列,递归打印即可。 #include <cstdio> #include <cstring> #include <algorithm> using namespa...原创 2019-04-06 14:50:43 · 113 阅读 · 0 评论 -
Codeforces 149D
好复杂的dp。 区间dp真是玄学~ 给个合法的括号序列,每个括号能涂红色、蓝色或者不涂颜色,要满足的条件: 一对匹配的括号中必须至少有一个要涂上颜色 相邻的括号不能涂同一种颜色(但是可以都不涂颜色) 求给整个序列涂上颜色的方案数 考虑到约束条件,两个变量记录区间的边界显然不够,还要记录当前区间涂不同组合的颜色的方案数,所有就变成了四维 d[i][j][k][l] 表示区间[i,j]中i 涂 k ,...原创 2019-04-07 00:07:42 · 577 阅读 · 0 评论