区间DP
文章平均质量分 75
BraketBN
这个作者很懒,什么都没留下…
展开
-
【BZOJ1296】[SCOI2009]粉刷匠【区间DP】【背包DP】
【题目链接】区间DP+背包,感觉比较厉害的题。【qpswwww的题解】/* Footprints In The Blood Soaked Snow */#include #include using namespace std;const int maxn = 55, maxt = 2505;int n, m, t, f[maxn][maxn], sum[maxn]原创 2016-03-31 20:38:54 · 491 阅读 · 0 评论 -
【BZOJ4580】[Usaco2016 Open]248【区间DP】【或 贪心】
【题目链接】以为adjacent是不同的意思,结果是相邻23333,写了个贪心WA了一发。题解:设dp[l][r]表示将l和r合并之后,得到的最大的数,于是就可以转移了dp[l][r] = dp[l][k] + 1(dp[l][k] == dp[k + 1][r])另外还有贪心写法,只不过太麻烦了...话说好像写记忆化搜索的会被卡。。复杂度:时间原创 2016-06-10 09:21:24 · 1309 阅读 · 0 评论 -
【BZOJ1742】[Usaco2005 nov]Grazing on the Run 边跑边吃草【区间DP】
【题目链接】算是比较经典的区间DP,比较重要的思路是,把未来的花费放到现在计算。一开始写了个空间O(n^2)的记忆化搜索,结果被卡内存了,最后换成循环了.../* Forgive me Not */#include #include #include using namespace std;const int maxn = 3001, inf = 0x3f3f3f原创 2016-06-01 17:46:41 · 971 阅读 · 0 评论 -
【BZOJ1710】[Usaco2007 Open]Cheappal 廉价回文【区间DP】
【题目链接】经典区间DP。首先添加一个字符和删除一个字符是等价的,因为在一个位置添加一个字符,就等价与在对称回文的位置删除一个字符,删除同理。那么我们只需要考虑删除字符。设dp[l][r]表示将[l, r]改为回文串的最小代价,那么有(1)dp[l][r] = min(dp[l + 1][r] + cost[str[l]], dp[l][r - 1] + cost[str[r]原创 2016-05-31 18:49:52 · 754 阅读 · 0 评论 -
【BZOJ1260】[CQOI2007]涂色paint 【区间DP】
【题目链接】设dp[i][j]表示[i, j]这段字符串经过粉刷的最小次数。分两种情况转移:(1)str[i] == str[j]那么str[i]有可能在粉刷str[j]的时候被粉刷了,此时dp[i][j] = dp[i + 1][j];对str[j]也同理,有dp[i][j] = dp[i][j - 1]。(2)str[i] != str[j]那么枚举中间位置k,原创 2016-04-23 15:34:26 · 449 阅读 · 0 评论 -
【BZOJ1068】[SCOI2007]压缩【区间DP】
【题目链接】一开始以为R必须连续,敲了一发,结果发现样例1挂了...然后看了【hzwer的题解】,原来要这么写= =/* Telekinetic Forest Guard */#include #include #include using namespace std;const int maxn = 55, inf = 0x3f3f3f3f;int dp[maxn][m原创 2016-05-14 11:16:42 · 627 阅读 · 0 评论 -
【BZOJ1996】[Hnoi2010]chorus 合唱队【区间DP】
【题目链接】手画一下样例就有点感觉了。一开始定了二维的状态,发现答案跑不对,后来意识到需要第三维,表示当前区间最后一个填的数是最左边的还是最右边的,然后就可以转移了。/* Telekinetic Forest Guard */#include #include #include using namespace std;const int maxn = 1005,原创 2016-05-24 08:49:36 · 371 阅读 · 0 评论 -
【BZOJ1564】[NOI2009]二叉查找树【区间DP】
【题目链接】这是一棵Treap,而且我们知道BST的中序遍历的数据值是递增的,那么我们按照数据值排个序,就得到中序遍历了。然后就变成区间DP啦。设dp[l][r][m]表示,区间[l, r]的节点组成的树中的,根节点的权值≥m的最小代价。然后枚举根节点转移。(1)将根节点i的权值修改为m,有dp[l][r][m] = dp[l][i - 1][m] + dp[i + 1][r][m原创 2016-04-26 15:21:18 · 954 阅读 · 0 评论 -
【BZOJ1090】[SCOI2003]字符串折叠【区间DP】
【题目链接】设dp[x][y]表示[x, y]这个区间可以折叠的最小长度。那么dp[x][y] = dp[x][i] + dp[i + 1][y]。对于可以折叠的一部分,有dp[x][y] = dp[x][i] + 2 + calc((y - x + 1) / (i - x + 1))。calc()是算十进制数字的长度的。/* Footprints In The B原创 2016-03-22 21:27:21 · 377 阅读 · 0 评论 -
【BZOJ1055】[HAOI2008]玩具取名【区间DP】【状压】
【题目链接】一开始WA,以为DP写跪了,最后发现是hash数组开小了...设dp[x][y]表示[x, y]这个区间可以化简成的最简状态,其中状态用0到15的二进制表示。转移时候分割区间,得到两个区间的状态,然后看有没有对应的字符即可。边界状态是区间长度为1,和区间长度为2两种。/* Footprints In The Blood Soaked Snow */原创 2016-03-22 14:05:28 · 546 阅读 · 0 评论 -
【BZOJ2121】字符串游戏【区间DP】
【题目链接】int开成bool,调了半天...设ok[i][j]表示模板串[i, j]这段是否能被删除完,再设dp[i]表示模板串[1, i]删除之后最少剩多少字母,那么显然有dp[i] = dp[i - 1] + 1if(ok[j][i]) dp[i] = min(dp[i], dp[j - 1])现在考虑如何得到ok[i][j]。设f[i][j][k][原创 2016-06-27 09:14:45 · 571 阅读 · 0 评论