
区间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 · 230 阅读 · 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 · 151 阅读 · 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 · 129 阅读 · 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 · 129 阅读 · 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 · 258 阅读 · 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 · 132 阅读 · 0 评论 -
Codeforces 149D
好复杂的dp。区间dp真是玄学~给个合法的括号序列,每个括号能涂红色、蓝色或者不涂颜色,要满足的条件:一对匹配的括号中必须至少有一个要涂上颜色相邻的括号不能涂同一种颜色(但是可以都不涂颜色)求给整个序列涂上颜色的方案数考虑到约束条件,两个变量记录区间的边界显然不够,还要记录当前区间涂不同组合的颜色的方案数,所有就变成了四维 d[i][j][k][l] 表示区间[i,j]中i 涂 k ,...原创 2019-04-07 00:07:42 · 599 阅读 · 0 评论