动态规划—区间dp
文章平均质量分 66
My_ACM_Dream
生活没有彩排每天都是现场直播
展开
-
南阳理工746整数划分(区间dp)
题意:给出一个数n,划分成m段,求怎么划分让所有段的成乘积最高。题解:区间dp。状态:dp[i][j] 前j个点分成i段乘积的最大值。这里有一个分解整数子序列的一个函数,自己写了下,发现挺简单。#include#include#include#include#includeusing namespace std;typedef long long lld;#d原创 2014-12-10 22:08:42 · 673 阅读 · 0 评论 -
NYOJ 304 节能 (区间dp)
题意:一个机器人要去关路灯,起初机器人站在某个位置,给出每盏路灯的位置和每秒的花费,机器人的速度是1m/s,现在问机器人在将全部灯关掉的期间,灯的最小消耗是多少。题解:区间dp,dp[l][r][2]表示区间l-r都关完灯了,0表示站在左边,1表示站在右边。用记忆搜索比较好些,但是边界条件要处理好。两种方法:#include#include#include#include原创 2015-04-17 14:05:51 · 986 阅读 · 0 评论 -
hihoCoder 1110 正则表达式 (区间dp)
题意:根据题目要求判断输入的串是否是正则表达式给定一个字符串,判断其是否为合法的正则表达式。 一个正则表达式定义为: 1:0是正则表达式,1也是正则表达式。 2:P和Q都是正则表达式,则PQ是正则表达式。 3:P是正则表达式,则(P)是正则表达式 4:P是正则表达式,则P*也是正则表达式 5:P和Q都是正则表达式,则P|Q是正则表达式。题原创 2015-04-26 17:06:11 · 1721 阅读 · 0 评论 -
codeforces 313D Ilya and Roads (区间dp)
题意:n个洞,m个公司,至少补k个洞,每个公司只能补Li到Ri之间的懂,并且费用是ci。问补至少k个洞的最小费用。题解:首先我么要这题要知道任意段区间之间的费用是多少,因为公司的区间是可以重合的,但是重合部分要多计算,那么我们可以用(n^3)的计算出任意段区间的费用。接着我们就可以dp了,dp[i][j]表示前i个点补了k个洞的最小费用。状态方程和往常非常不同本来是要O(n^4)现原创 2015-02-09 17:30:15 · 667 阅读 · 0 评论 -
hihoCoder 1149 回文字符序列 (区间dp)
题意:求一个串的回文子序列有多少个。题解:dp[i][j]表示[i,j]区间回文子序列的个数。dp[i][j] = dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1];if(str[i] == str[j]) dp[i][j] = dp[i+1][j-1] + 1;不断从内往外推,一旦存在str[i]==str[j]那么要加上dp[i+1][j-1原创 2015-05-13 10:33:24 · 967 阅读 · 0 评论 -
poj 3186 Treats for the Cows (区间dp)
给出n个数,形成一个队列,每个数可以从队首和对尾出来,第k个数来的数的价值等于这个数本身的值*k,问怎么样出队,能让中和最大。状态返程:dp[i][j] = max { dp[I+1]j] + a[i]*(L-i+1) , dp[i][j-1] + a[j]*(L-i+1) } 可以认为除了这个区间,以外的数都出队了,那么现在出队的序号就是L-i+1; L是枚举的长度,i是起点#原创 2014-12-01 10:58:07 · 473 阅读 · 0 评论 -
hdu 3280 Equal Sum Partitions (区间dp)
这道非常棘手,几乎没思路,看了题解才会做,感觉对区间dp熟悉。好吧,个人想法理解下这题。们要分出的和最小,那么肯定要用 i - j区间的和与 i-k k-j区间的和进行比较,比较dp值意外还要比较新加进来的 也就是sum[j]-sum[k] 和 sum[k]-sum[i-1];枚举断点不断跟新,怎么感觉和线段树好像。#include#include#include#incl原创 2014-11-29 15:08:29 · 628 阅读 · 0 评论 -
poj 1651 Multiplication Puzzle (区间dp)
题意:给出一串数字串,可以任意取数,所得到的价值为这个数乘以左右相邻的数,问如何去数让总价值最大。题解:区间dp不用说了,状态要好好体会,很好。dp[i][j] 表示“开区间”里面的数都被取走了的最大价值。Ps:记着实开区间两种情况:1、后面一段和前面一段都被取走了2、对于i-j区间,断点k,i-k k-j 内的都被取走了。/*状态:dp[i][j]表示“开区原创 2014-12-10 13:12:11 · 569 阅读 · 0 评论 -
poj 3280 Cheapest Palindrome (区间dp)
题意:给出很一个含有m个字符的字符串,然给出字符串中出现的字符对应删除和添加的价值,问怎么操作使这个字符串成为回文,并且价值最小。题解:状态:dp[i][j] 表示i到j的最小价值,这样思考:三种情况:1、如果dp[i+1][j]已经是回文了,那么就考虑是将i这个位的字符删除还是在j后面加上a[i] 2、如果dp[i][j-1]是回文串了,其他的同上。3、dp[i+1][j原创 2014-12-10 11:38:52 · 488 阅读 · 0 评论 -
hdu 4283 You Are the One(区间dp)
题意大概就是有n个男生,每个男生都有一个屌丝值(value),现在男生排成一队,第k个出来的男生的屌丝值为k*value,现在有一个黑箱子,任何位置的男生可以进入黑箱子来调整位置,比如说第k个男生进去,那么他可以再k之后的任何一个男生的位置出来。一个黑箱子可以有多个男生进入,但是先进去的要后出来。问怎么样让总屌丝值最小。其实这就相当于一个栈,先进后出,题目意思可以转化成:一个序列怎么样进栈和出原创 2014-12-01 10:36:02 · 580 阅读 · 0 评论 -
hdu 2476 String painter (区间dp)
记得好像在网络赛中看到过,可惜不会做。感觉对区间dp中像这种匹配的问题特别不擅长0.0。枚举长度dp,首先考虑空白串变到第二个串的最小步数,然后在一维dp一下从第一个串变到第二个串的最小步数。为什么这样做呢?想想如果直接从第一个串变到第二个串容易吗?是不是想不到很好的办法实现?!#include#include#include#include#include#include#i原创 2014-11-29 13:57:58 · 597 阅读 · 0 评论 -
Codeforces149D(计数区间dp)
题意:给出串规律的括号(括号是匹配好的)比如说 ( ( ) ( ) ) 这个括号的真确匹配是 第一个和最后一个、第二个和第三个、第四个和第五个。现在要给括号染色,给出这些条件:1、括号可以不染色、染蓝色、染红色。2、匹配的括号不能同时染色,但其中一个必须染色。3、相邻的括号不能染同种颜色,允许都不上色。题解:真的体会到记忆优化的好处,要什么状态加上什么状态,然后一次原创 2014-12-11 17:01:37 · 748 阅读 · 0 评论 -
poj 3254 Corn Fields(状压dp)
dp类计数问题,简答题,水过#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define ep 1e-9#define oo 0x3f3f3f3ftypedef __int64 lld;#define mod原创 2014-12-06 12:25:01 · 477 阅读 · 0 评论 -
hdu2476(区间dp)
再次做了下这题,经典,非常考验功底。/*状态:dp[i][j]表示“开区间”内的数都被取走了所得的最大值,开区间着重号!容易错!*/#include#include#include#include#includeusing namespace std;typedef long long lld;#define oo 0x3f3f3f3f#define maxn 100+原创 2014-12-10 16:11:57 · 573 阅读 · 0 评论 -
vj2006(区间dp)
很好的一题,一些细节要注意题意:有很多个珍珠,每个珍珠都有头和尾,两个珍珠合并之后所能得到的能量为:一个珍珠的头*第一个珍珠的尾*第二个珍珠的尾。问如何合并珍珠能够让能量最大题解:其实这题可以化简成求去某个数,得到的价值为这个数乘以左右相邻的数。那么定义这样的状态:dp[i][j]代表“开区间”(i,j)能得到的最大能量。注意枚举长度时要,长度要加1,这个小细节很重要。采用循环原创 2014-12-11 01:06:33 · 630 阅读 · 0 评论 -
Vj1218(环形区间dp)
题意:给出n个数(成环形的)要求分成m份,每份的和%10相乘,问如何能到的最大值、最小值。题解:枚举起点n次dp,找出最大值、最小值。#include#include#include#include#includeusing namespace std;typedef long long lld;#define oo 0x3f3f3f3f#define maxn 5原创 2014-12-11 11:33:14 · 682 阅读 · 0 评论 -
codeforces 509F Progress Monitoring (区间dp)
题意:给出一个深度搜索的代码,要求按照这样遍历树的结果为串b,不同构的树的个数。题解:区间dp,开始想到了递推方程,但是递推条件没想出来 a[k+1]>a[i+1]。状态dp[i][j]以i为根到j位置这个区间构成的子树的方案数。方程dp[i][j]+=dp[i+1][k]*dp[k][j] 第二从k开始时因此要接成整棵树必须要有相同的的节点。条件a[k+1]>a[i+1] 这原创 2015-02-04 13:34:20 · 607 阅读 · 0 评论 -
zoj3537(区间dp)
最有三角形划分,凸包不会也抄了别人的凸包代码一直wa不明觉厉,不过dp算是想对了;#include#include#include#include#includeusing namespace std;typedef long long lld;#define oo 0x3f3f3f3f#define mod 1000000007#define maxn 300+5int原创 2014-12-11 20:39:16 · 818 阅读 · 1 评论 -
hdu 5151 Sit sit sit(区间dp)
题意:给出一排座位现在要让所有学生入座,每个座位都有颜色,0表示蓝色,1表示红色,但是如果同时满足以下条件学生就不会坐下这个位置:1、座位的左右都有座位2、座位的左右都有人坐下了3、座位的左右的颜色不同题解:明显的区间计数类dp状态dp[i][j] 表示i到j区间的方案个数!那么枚举中间点k作为最后入座的学生。之前先预处理下排列组合的数组。状态返程 dp[i][原创 2014-12-29 00:20:55 · 738 阅读 · 0 评论 -
codeforce Ilya and Roads (区间dp)
题意:给出一条n个洞的路,现在又m个公司,第i个公司可以修补Li—Ri的这些洞,花费c的费用。允许修补区间重叠但是重叠部分的费用都要付给对应的公司。题解:题目化简为求区间1—n修补各个小区间并且修补至少k个洞的最小值。做法比较巧妙看代码。#include#include#include#include#include#include#includeusing na原创 2015-01-31 09:40:13 · 458 阅读 · 0 评论 -
zoj 3469 Food Delivery (区间dp)
没想到还会回来写博客,算是回忆下把,来一道区间dp基础题。题意:一个送外卖的从某个出发点送外卖,但是每个顾客地点都有一个不满意值,会随着时间每秒增加b[i],每个顾客地点都有一个距离,可以人为是在x轴上的坐标。现在问如何送外卖使得不满意度最小。题解:好像做过,不过这次换了一个更优美的姿势过,记忆优化写起来会比较好写,而且姿势优美。dp[i][j][pos]表示[l,r]区间的顾客都原创 2015-07-23 10:28:49 · 1026 阅读 · 0 评论