![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP
文章平均质量分 73
ZhouMu
这个作者很懒,什么都没留下…
展开
-
poj--1088
求有向图上的最长路径长度。#include#include#define maxn 120using namespace std;int d[maxn][maxn],h[maxn][maxn];int n,m;int dx[]={ 1,-1,0,0};int dy[]={ 0,0,1,-1};int dfs(int x,int y){ if(d[x][y])retu原创 2013-01-15 16:03:10 · 293 阅读 · 0 评论 -
UVA--10859--Placing Lampposts--DP
求两个变量v1和v2在先满足v1最小的情况下,再求v2的最优值,可设 x = M*v1+v2,,其中M是一个很大的值,这样求出的x的最优值就是题目所求,因为在这个式子里面v1起到决定性的作用参考了一下书上的代码,树上的DP,可以一边dfs一个DP#include#include#include#include#include#include#include#include原创 2013-08-08 11:54:26 · 555 阅读 · 0 评论 -
HDU --4283--You Are the One--区间DP
想好出栈入栈的情况,别多想,别少想,然后就可以DP了假设一段区间[s,e],中间点是m,那么m把区间分成了两部分,[s,m]和[m+1,e],设dp[i][j]为区间[i,j]最小吊丝和,sum[i][j]为区间[i,j]的每个男生的吊丝值的和.那么,[s,m],和[m+1,e]两段区间就可以有两个决策:一:区间一的所有人先上舞台。二:区间二的所有人先上舞台。如果区间二的人先上原创 2013-08-09 10:28:30 · 538 阅读 · 0 评论 -
HDU -4571--Travel in Time
各种细节坑死人#include#include#include#include#include#include#includeusing namespace std;const int MAXN = 110;const int INF = 1<<28;struct node{ int c,sa; int node_id;}p[MAXN];int di原创 2013-08-22 11:56:47 · 563 阅读 · 0 评论 -
POJ--1185--炮兵阵地--状态压缩DP
话说过了很久,又把这个题目写了一遍,这次代码精简多了,话说粗心写错了两个地方,调试了很久。。。感觉很冤枉,论写代码时思维的严密性与细心#include#include#includeusing namespace std;const int MAX_N = 110;const int MAX_M = 15;const int MAX_ST = 100;int sc原创 2013-08-10 11:13:12 · 495 阅读 · 0 评论 -
POJ--3017--Cut the Sequence--DP优化
题目大意:求一个数字序列的划分,每一个划分块的和不大于M,求出所有划分块最大值的最小值。DP方程:dp[i] = min{dp[j]+max(a[j+1],a[i])}用一个单调队列存储所有可行的决策,这个单调队列里面存储条件是队列范围的所有元素和不大于M,所以队列元素的个数就是每个点的决策个数。更详细的题解可以看一下别人的blog#include#include#includ原创 2013-08-11 14:49:10 · 793 阅读 · 0 评论 -
HDU--2829--Lawrence--斜率优化做法
嗯,我是看别人的题解做,复述一下思路有助于强化记忆(* ̄m ̄)首先搞一个前缀和数组 sum[i] 你应该知道这是干嘛的,然后就是一个关键的 w 数组,w[i] 表示前i个数两两相乘的和,这是根据题意来的。然后咧,状态转移方程就是这样滴: dp[k][i] = min{dp[k-1][j]+val(j+1,i)|0<=j<i}val(j+1,i)表示[j+1,i]区间内的数字两两相乘原创 2013-08-23 22:13:07 · 579 阅读 · 0 评论 -
POJ--2441--Arrange the Bulls--状压DP-滚动数组优化
dp[i][j] 表示前 i 头牛放成 j 状态的数量然后就可以状压DP 了,提前看了一discuss,说要用滚动数组,想想也是,加上数组优化后空间用了9M,不用滚动数组的话使用空间就是 9*10 = 90M ,题目只给了64M的空间。刚提交了一下不优化空间的,还真MLE了。。。。。。。。。我是不是很无聊。。。亲自验证一下而已-_-##include#include#includeu原创 2013-08-12 10:43:35 · 563 阅读 · 0 评论 -
HDU --3555--Bomb--数位DP
为什么N 要加1 ,为什么计算的小于N 的所有数?!!为什么!!!??为什么??!!!!#include#include#includeusing namespace std;typedef long long LL;const int MAXN = 30;LL dp[MAXN][3];//dp[i][0] indicate i bits without 49//dp[i]原创 2013-09-18 16:42:04 · 492 阅读 · 0 评论 -
数位DP--不要62
题目大意:求出给定区间内,不包含62 和 4 的数字的个数思路在代码里面,细节蛮多的,注意一下#include#include#include#includeusing namespace std;const int MAXN = 10;int dp[MAXN][2];//dp[i][0] 表示长度为i的任意数字中不含4 也不含62 的数字的个数//dp[i][1] 表原创 2013-09-19 08:48:14 · 595 阅读 · 0 评论 -
数位DP --Windy数
满足一下条件的数字称为windy数不考虑前导0,所有相邻的两个数字的差至少为2。求出任意区间内的所有windy数思路:dp[i][j]表示所有长度为 i 的数字以 j 开头的windy数的个数。0仔细考虑前导0 的影响,已注释在代码中#include#include#include#define bugusing namespace std;const int M原创 2013-09-20 10:35:29 · 636 阅读 · 0 评论 -
Round Number --数位DP
如果一个数的二进制表示里面,0的个数大于等于1 的个数(不计算前导0),那么这个叫做round number。求一个给定区间内的round number。思路:假设一个二进制数的第 i 位(从右往左数,从1 开始)是1 的话,那么当第i位为0的时候,从这个数的第 i 位往右的那些二进制位可以是任何数(1或者0 ),换句话说,就是第 i 位右边的 二进制位不论是1还是0都小于原来的数字的原创 2013-09-20 15:58:02 · 1113 阅读 · 0 评论 -
XHXJ's LIS---数位DP
练习了几道数位DP 的题目,数位DP的大框架已经基本上熟悉了。由于求LIS的长度不超过十位,所以可以用NlogN的求LIS 的方法去更新二进制位的保存的LIS;具体做法是这样的(看清楚接下来的表述前提是你已经熟悉了数位DP 的dfs做法框架),用一个整数状态表示前面已经得到了的LIS具体出现的数字,比如求出的LIS长度是2,具体Sequence 是12,然后这个整数状态就是3,然后寻找当前原创 2013-09-24 12:05:49 · 667 阅读 · 0 评论 -
HDU --3652--b_number--数位DP
求出区间内有13作为连续子串且是13的倍数的数字的个数思路:dp数组增加一维用来表示状态数字对13取模的余数就好了,然后状态转移的时候按照找出含有13的数字的个数就可以了,二维转移。代码没有用传统的数位DP框架下的dfs函数写,用状态推的,这样的写法与用传统的dfs写法不同点在于dfs方法求出的数字包含了传入的数字本身,所以答案一般是solve(b)-solve(a-1),,,这题的递推写原创 2013-09-25 18:49:56 · 531 阅读 · 0 评论 -
hdu--3709--Banlanced-Number--数位DP
数位DP也就这样子了,看了别人的思路,写下来的代码居然就一模一样了,可见数位DP的框架还真就定死了的。用dp[pos][o][pre] 表示状态,然后枚举中间点就知道怎么做了。反正框架就是这个样子了,一位一位的往后推,记录前面数字的状态就可以了,变化无非就是前面数字的状态表示,想到了状态如何表示,题目就迎刃而解了。数位DP的考点应该就是状态的建模了。#include#incl原创 2013-09-25 18:45:09 · 529 阅读 · 0 评论 -
UVA--1099 - Sharing Chocolate
题目大意:给定一个长为w,宽为h,的巧克力,再给定一个面积的集合,问巧克力能不能完全分割成给定的面积的集合?(面积集合的大小小于等于15)解题思路:对给定的面积集合用状态枚举子集,在利用记忆化搜索判断能够分解成给定的集合#include #include #include #include #include using namespace std;const int MAXN原创 2014-03-27 08:01:24 · 612 阅读 · 0 评论 -
HDU--4521--带间隔的LIS
求最长的LIS,但是LIS的任意两个两个元素要在原序列里面间隔至少K个位置。计算了每个元素的d值(也就是长度为I 的最小元素值),延缓K个时间再加入到队列里面去。#include#include#include#include#include#include#include#includeusing namespace std;const int INF = 9999原创 2013-08-07 18:10:46 · 650 阅读 · 0 评论 -
2013多校第三场 --Pieces--状态压缩DP
题目大意:删除一个字符串里面的回文子串,问最少需要多少次可以删完整个字符串题解:其实是个蛮简单的题目,比赛完了艾神一点就会了,比赛的时候就是没想到,比赛的时候没想到状态怎么压缩。。还是经验不够。#include#include#include#include#define maxn (1<<16)using namespace std;int dp[maxn];int sta原创 2013-07-30 19:00:13 · 613 阅读 · 0 评论 -
POJ--1837--Balance--DP
顶呱呱的题解:点击打开链接#include#include#include#define maxn 30#define flow 7500using namespace std;int f[maxn][maxn];int n,m;int c[maxn],g[maxn];int dp[maxn][15020];void solve(){ dp[0][flow]=1;原创 2013-03-29 12:01:23 · 531 阅读 · 0 评论 -
POJ--1141--Brackets Sequence--记录DP路径
区间DP,然后记录路径,,,貌似类似题目以前做过的,但是忘了。。#include#include#include#define INF 1000000#define maxn 120using namespace std;int d[maxn][maxn];int p[maxn][maxn];char s[maxn];void init(){ memset(d,-原创 2013-03-15 22:21:31 · 544 阅读 · 0 评论 -
POJ--1160--Post Office
这是一道经典的DP题,数组开小了,POJ报WA,调试方向错了,调10年都是错的,要是在比赛的时候紧张的环境就更不容易发现错误了,就觉得在任何情况下保持冷静的头脑是一件很难得的事。题目大意:给定在x轴上的N个村庄(就是所有村庄在一条直线上面),在这N 个村庄中选出M 个点作为邮局,使得每个村庄到最近的邮局的距离和最小,求出这个最小的距离和。解题报告:假设在N 个村庄中选择一个村庄作为邮局使得原创 2013-03-20 10:12:55 · 521 阅读 · 0 评论 -
POJ--1655--Balancing Act--简单树形DP
注意建树过程#include#include#include#include#define maxn 20001using namespace std;vector g[maxn];int p[maxn];int banlance[maxn];int n;void init(){ scanf("%d",&n); for(int i=1;i<=n;i++) { p原创 2013-03-21 08:48:13 · 474 阅读 · 0 评论 -
POJ-1155--TELE--树形DP
左孩子有兄弟表示树,想明白了也不是很难.。每DP完成一个孩子节点,就用这个孩子节点更新父亲的信息。#include#include#include#define INF 99999999#define maxn 3010using namespace std;struct node{ int v,w; // v is u's first child int next;原创 2013-03-21 22:13:35 · 473 阅读 · 0 评论 -
POJ--3140--Contestants Division
题目大意:求一棵树被划分成两部分之后,这两部分权值和的差的绝对值的最小值水题无误了,因为long long 没处理好WA了几次,略坑爹#include#include#include#include#define maxn 100005using namespace std;typedef long long LL;template T oabs(T a){return a原创 2013-03-22 10:07:11 · 518 阅读 · 0 评论 -
POJ--1947--Rebuilding Roads--树形DP
题目大意:剪掉一棵树的一些边,求生成一颗节点数目为P为的子树最少要剪掉多少条边。解题报告:状态转移和背包思想类似,但是注意每剪掉一条边,剪下的是一颗子树,剩下的是一颗子树,此时需要检查剪下的子树的节点数量数否符合题意和剩下的节点数量是否符合题意。因为每次剪下一颗子树只需要一条边,所以如果剪下的子树刚好有P 个节点的话,答案就是1 了#include#include#include#i原创 2013-03-22 11:28:50 · 491 阅读 · 0 评论 -
POJ--2378--Tree Cutting--树形DP
介个,,,会了1655很自然就会这个题了,简直就是一模一样的#include#include#include#include#include#define INF 99999999#define maxn 12000using namespace std;int n;int p[maxn];int ans[maxn],ic;int num[maxn];vector原创 2013-03-22 09:11:05 · 519 阅读 · 0 评论 -
POJ--2486--Apple Tree--树形回溯DP
反思:在写代码的过程中,尽量使代码的行为符合实际的逻辑,避免出现与实际逻辑无关甚至相违背的代码,尽管这些代码看上去不是那么的重要,但这是十分隐蔽的Bug.参考题解:点击打开链接这是典型的回溯型树状dp。dp[i][j][0]代表以i为根节点的子树最多j步后回到i能吃到的最多的苹果,dp[i][j][1]代表以i为根节点的子树最多j步后不回到i节点最多能吃到的子树。那么状态转移就分三原创 2013-03-23 10:30:04 · 497 阅读 · 0 评论 -
POJ --1170 -Shopping Offers--DP
五维DP,蛋碎了,,很久不写题解的我也想记下这段优美的代码了#include#include#include#define maxn 1000using namespace std;int code[6]; //each item's codeint dcode[maxn]; //dcode[code]=indexint num[6]; //each item's number原创 2013-04-23 17:04:59 · 506 阅读 · 0 评论 -
POJ --1185--炮兵阵地--状态DP
貌似高中的时候就见过的这题,思路全在代码注释里了#include#include#include#define maxn 120using namespace std;int bmp[maxn]; //用二进制表示后,压缩存储地图的每一行 int n,m; int statu[maxn],sc; //保存一行内长度为 m 的满足互不攻击的排兵状态 ,预先处理,好思原创 2013-04-24 17:37:31 · 570 阅读 · 0 评论 -
POJ--1038--Bugs Integrated, Inc.--状态DP
硬着头皮写了两天,下面把思路复述一下:一:状态的表示:对于每一行来说,a[x]={0,1,2};分别表示格点x的上方有{0,1,2}个空格可用。和黑书的不一样,我觉得这样表示比较方便直观一点就这样表示了。然后对于每一行可看做是一个三进制的数字,再把这个三进制数转换成十进制数字,从而实现状态压缩存储的目的。二:dp 数组的表示:dp[i][j] 表示从第i-1行的任意状态得到的第i行原创 2013-04-27 09:40:34 · 579 阅读 · 0 评论 -
POJ --3254--Corn Fields--状态DP
状态DP上手~和炮兵阵地很相似的道理,会了炮兵阵地就会这个了。同样的思路,当前行的状态由上一行的可行状态整合而来,具体思路见代码#include#include#include#define maxn 20#define dbug1#define M 100000000using namespace std;const int maxStatu=1<<13;int bm原创 2013-04-27 17:23:13 · 489 阅读 · 0 评论 -
POJ--1661--Help Jimmy--DP
题目链接:戳这里解题报告:先把板子排个序,从高到低的,然后从低到高的依次计算每个板子分别从这个板子的左边落下去的最短时间,和从这个板子右边落下去的最短时间。其实挺简单的,从下往上处理就好了具体思路见代码#include#include#include#include#define INF 99999999#define maxn 1005using namespac原创 2013-05-04 23:36:32 · 457 阅读 · 0 评论 -
POJ--1770--Special Experiment--树形DP
互相排斥的点,连一条边,然后就是很正常的树形DP了,,因为看了discuss里面的说的可能有环的情况,就是不知道数据里面有没有换,所以就接受建议直接用邻接矩阵存了。#include#include#include#define maxn 210#define dbug#define M(a) memset((a),0,sizeof((a)))using namespace st原创 2013-05-06 23:29:49 · 1035 阅读 · 2 评论 -
ZOJ-3777-Problem Arrangement
题目大意:安排一场ACM比赛的题目shu原创 2014-05-18 11:09:45 · 589 阅读 · 0 评论