![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
dp
文章平均质量分 68
zhhx2001
这个作者很懒,什么都没留下…
展开
-
bzoj3124(树形dp)
求有多少条边:满足所有直径都经过该边。 两边树形dp,一遍以点做dp求出直径的个数,再以边做dp判断在直径上边的个数。 #include#include#include#include#includeusing namespace std;const int N=200005;const int inf=0x3f3f3f3f;typedef long long ll原创 2017-01-17 09:55:53 · 447 阅读 · 0 评论 -
vijos1144&&bzoj1596(树形dp,树上最小控制集
非常经典,但是关于转移方程不重不漏的证明还是需要自己证一下f【i】【0】表示选根节点的最小费用f【i】【1】表示选根的父亲的最小费用f【i】【2】表示选根的儿子的最小费用转移推一下就好了,这种状态表示的方法极为巧妙,树形dp中设计状态真心值得思考#include#include#include#include#includeusing name原创 2016-08-22 10:15:19 · 349 阅读 · 0 评论 -
bzoj1827(树形dp)
以前见过这样思路的题,所以就不难。。。。不过,我终于遇见到了最大值不够大,然后wa的情况了。。。。最后把最大值开到12345678910111213才过。。。17位啊#include#include#include#include#includeusing namespace std;typedef long long ll;const int N=120005;原创 2016-08-22 11:24:55 · 337 阅读 · 0 评论 -
hdu3534,恶心的树形dp,需要考虑的东西太多了
是够恶心的,然而不被恶心几次,代码能力也就练不出来了/node[x]中记录的是://x的子节点通过x连接(就是在x的子树内的)的最长路径为max,条数为num,//Max1是x的子节点到x的最长距离,num1是条数//Max2是x的子节点到x的次长距离,num2是条数分为,如果节点都是一样的情况,如果节点有最长和次长距离,分情况#include#include#原创 2016-06-17 17:49:13 · 463 阅读 · 0 评论 -
bzoj1613(dp)
看数据范围,转移就模拟一下决策就好,水题。。#include#include#include#include#include#includeusing namespace std;int n,m;int dp[10005][505];int d[10005];int main(){ scanf("%d%d",&n,&m); for (int i=1;i<=n;i+原创 2016-08-21 18:58:02 · 457 阅读 · 0 评论 -
poj2923 状态压缩背包dp
题意: 有 n 个货物,并且知道了每个货物的重量,每次用载重量分别为c1,c2的火车装载,问最少需要运送多少次可以将货物运完。分析: 找出所有状态(1.....(1 把每个状态都看作一个物品,重量为该状态的总重量,价值为 1 求解 01 背包,dp[(1 转移方程: dp[stat|j]=min(dp[stat|j],dp[原创 2016-05-28 11:03:22 · 445 阅读 · 0 评论 -
bzoj2064(状压dp)
题目中给出的比较显然的状态,也因为数据范围比较显然地不能那么设计状态。。那么分析题目性质,我们会发现,最多需要移动n+m-2次。实际上,简化移动,就是如果两堆当中如果有相等大小的就会减少移动次数,相等的堆数越多,减少的移动次数就越多。因此我们就想办法计算出最多能减少多少移动次数,怎么办呢?。。反正我不会。。看题解,这里采用状压dp:最优方案中出现的所有数一定是一开始两个原创 2016-08-20 17:58:58 · 434 阅读 · 1 评论 -
bzoj1609(dp)
f[i][j]表示到第i头牛数字为j的最少修改次数(转移方程详见代码),正反各来一次,计算出所有方案的最小值。 #include #include #include #include #include using namespace std; const int inf=0x3f3f3f3f; int n,a[30005],f[30005][4];原创 2016-09-10 09:16:54 · 303 阅读 · 0 评论 -
bzoj1606(背包)
水。。背包可行性问题。。#include#include#include#include#includeusing namespace std;int n,m;bool b[50050];int main(){ scanf("%d%d",&m,&n); b[0]=true; int v; for (int i=1;i<=n;i++原创 2016-09-09 21:03:15 · 585 阅读 · 0 评论 -
bzoj1806(dp)
主体思路,并不难想,但是刚开始,我感觉处理起来很麻烦,这主要还是因为,我对题目的认识达不到主体思路对了不行,真正做出一道题,还是要把转移方程和状态表示搞的足够清楚才行#include#include#include#include#include#include#define FOR(i,l,r) for(int (i)=(l);(i)<=(r);(i)++) us原创 2016-08-19 14:50:57 · 362 阅读 · 0 评论 -
bzoj1296(dp套背包dp)
对于每一个m的dp没有什么难的,总的背包dp也不难,但是两个连在一块真是非常巧妙整体来看,就是,将t次的粉刷次数分给各个行求的最大值。就是分配先预处理(dp)每一行粉刷1~min(t,m)(因为一行最多涂m次,所以处理到m就可以了)次的最大粉刷格子数。发现很像泛化背包的模型,再外层再做一次分组背包就可以了这所以这么做是因为:我们可以发现不同的木板是相互独立,怎么计算和处理之间互原创 2016-08-19 11:57:28 · 1134 阅读 · 0 评论 -
bzoj1037(dp 1A)
这道题做的痛快!加油!因为发现三维没法表示状态,没法处理所以,发现数据范围,允许我们再加一维。所以用四维进行表示Dp[i][j][k1][k2]表示i个男孩,j个女孩,从后往前,男孩最多比女孩多k1个,女孩最多比男孩多k2个的方案数(实际上,我们在后面再加一个人,影响区间的男女之差,只会影响到之前那个区间的后缀,因为,前面的区间已经固定了,是不会影响到的)。转移就分,这原创 2016-08-19 10:30:43 · 280 阅读 · 0 评论 -
bzoj1222(dp)
以前见过这样类型的dp,就顺手水过了。这一类就是用f【i】表示a状态为i,b的最小状态。#include#include#include#include#includeusing namespace std;typedef long long ll;const int inf=0x3f3f3f3f;int f[2][30085];int t1[6005]原创 2016-08-18 23:37:13 · 456 阅读 · 0 评论 -
bzoj1925(next_permutation的第一次运用,难dp)
刚开始,写小范围暴力,试图找规律,顺便学习了一下next_permutation()(1) int 类型的next_permutation int main(){ int a[3];a[0]=1;a[1]=2;a[2]=3; do{cout} while (next_permutation(a,a+3)); //参数3指的是要进行排列的长度 //如果原创 2016-08-18 19:50:04 · 318 阅读 · 0 评论 -
bzoj4521(数位dp
自己的主体思路,没有什么问题,有一个情况没有考虑清楚,但主要还是边界出了问题失误的情况是:4和8,不能同时出现,但不代表不能出现两个4,这里当时就记了一个参数,当时以为自己想到了一个巧妙的方法(原来是个巧妙的错误。。)经验——避免这种没有情况的方法就是,1:考场上要对拍 2:注意尝试以一种,怀疑的态度审视自己的思路,再三思考自己认为正确的思路3:有一个,好的方向就是:尽管wa了原创 2016-08-18 16:50:50 · 353 阅读 · 0 评论 -
bzoj1864(树形dp)
其实就是以另外一种方式给出了一棵二叉树,然后要求根和左儿子和右儿子三者互相之间颜色互不相同,比较好设计状态,f【i】【0】 ,f【i】【1】,f【i】【2】分别表示根是绿红蓝三种颜色时的最多/最少绿色的数量,转移的时候只要保证上面的约束就行,并不难#include#include#include#include#includeusing namespace s原创 2016-08-22 13:14:26 · 317 阅读 · 0 评论 -
bzoj1087(状态压缩dp)
1.要用long long 必须的2.有一些东西是可以预处理的,就预处理一下#include#include#include#includeusing namespace std;long long f[10][82][1026]={0};int n,k,k1[1026]={0};bool pan(int x,int y){ if ((x&1)&&((y&1)|原创 2016-06-20 09:45:44 · 318 阅读 · 0 评论 -
斜率优化第一道——hdu3507(有图)
/ dp[i]= min{ dp[j]+M+(sum[i]-sum[j])^2 };斜率优化不等式的右边,要保证是单调的,才能用斜率优化#include#include#include#include#includeusing namespace std;int n,a[600005],q[600005],head,m,tail,sum[600005],f[6原创 2016-08-11 10:28:32 · 390 阅读 · 0 评论 -
tyvj模拟赛
待填坑。原创 2016-09-11 08:50:01 · 1126 阅读 · 2 评论 -
tyvj1864(概率dp初步)
#include#include#include#include#includeusing namespace std;double f[205][205][205];int n,l,k;struct aa{ int a; double p; bool operator <(const aa &b) const { return a原创 2016-11-21 21:57:23 · 455 阅读 · 0 评论 -
poj1849(树形dp)
试了好几遍才a。。方法很多,来我的g【i】:一个人走完子树的最短dissum【i】:子树的总边距离乘二,就是一个人走完回到根的路程f【i】【0】:表示两者在同一个子树中的最短距离f【i】【1】:表示两者在不同子树中的最短距离感觉状态的表难想,细节难处理。这里的状态,我感觉,是根据题目的性质,分情况(因为只有可能两人在同一个子树或不同的子树两种情况),分情况来表示原创 2016-08-15 09:21:09 · 406 阅读 · 0 评论 -
bzoj1835(线段树优化dp)
神题啊,好吧,应该是因为我太弱了。。。设f[i][k]表示到第i个村庄,第i个村庄一定会建基站,已经建了k个基站的最小费用.f[i][k]=min{f[j][k-1]+cost(j+1,i-1)}+c[i];cost(x,y)表示x到y这一段的最小补偿费用.这个dp是O(n^3)的,TLE.由于状态数已经是N^2,主要的瓶颈在于转移的复杂度cost(x,原创 2016-08-14 12:20:14 · 1010 阅读 · 0 评论 -
树形dp开学
hdu1520 水,就不多说了#include#include#include#include#includeusing namespace std;struct aa{ int pre,to;}edge[100090];int f[60090][2],a[60090],n,tot,head[60090],fa[60090];void addedge(int a,int原创 2016-06-15 16:19:40 · 311 阅读 · 0 评论 -
背包dp训练总结
背包dp分类:01背包dp完全背包(飞扬的小鸟)多重背包二维费用背包分组背包()有依赖的背包(难的还是不好解决,虽说是在每一个依赖中做一次01背包,但感觉不好实现)vijos1037 搭建双塔背包位运算的优化,bitset的实践#include#include#include#include#includeusing namespace std原创 2016-06-12 18:33:18 · 433 阅读 · 0 评论 -
poj3211(背包dp)
这是可行性的背包dp,就是问是否能够组成一个量首先,洗完一种再洗一种,颜色之间是不影响的。二,一种颜色的衣服已经定了,要洗的总量已经定了,要让总时间最少,就是要让两人洗的最为接近。(注意这道题只有两个人)转化为可行性的问题,能否组成一种方案,使得这种方案最接近总量的一半,总量一定,这一半最接近,那么那一半也是最接近的#include#include#in原创 2016-08-14 15:47:56 · 339 阅读 · 0 评论 -
vijos1426(状态压缩背包dp)
并不难想,但也是要练一练写代码的能力注意一点,这里用o【i】数组记录一个状态是否出现!因为N进制状态压缩,会出现太多太多无用的状态!,显然的会超时#include#include#include#includeusing namespace std;int n,m,v[7],f[5000050];bool o[5000050];int S,ans;bool pan原创 2016-08-14 15:10:25 · 349 阅读 · 0 评论 -
bzoj1003(dp+最短路spfa)这才是省选的题
设f[i]为1~i天的最少花费,那么dp[i]=min(cost[1,i],min{dp[j]+cost[j+1,i]+K,1≤ji})cost[i][j]表示一条在 i - j 时段保持畅通的运输路线的最短距离,(当时不能到的点置为b【i】=false)然后就是DP。关键是cost[i][j]直接暴力求出每条边可不可用就可以直接SPFA了,来局昆特牌吗,亲。#includ原创 2016-06-30 17:38:03 · 356 阅读 · 0 评论 -
bzoj1855(单调队列优化dp讲解)
这个,感觉思路不是特别清楚。单调队列维护dp,一般就是把一个N维的dp优化成一个N-1维的dp式子形如:dp【i】=max(f【j】)+g【i】(这里的g【i】是与j无关的量),且j的取值是一段连续区间,并随着i增大而增大的区间这里的f【j】是和j有关的项,一般包括dp【j】和与其相关的项。这道题:思路:设f[i][j]表示到第i天手里持有j的股票的最大收益,那么第i天原创 2016-08-13 15:54:52 · 1452 阅读 · 0 评论 -
noip2014飞扬的小鸟
开始挑战 飞扬的小鸟原创 2016-04-24 09:02:13 · 689 阅读 · 1 评论 -
bzoj3631(树链剖分或树形dp)
树链剖分,没有把线段树数组开大4倍!,卡了我好长时间!!!!#include#include#include#includeusing namespace std;const int maxn=800009;struct aa{ int to,pre;}edge[maxn];struct bb{ int add,l,r;}a[maxn*2];in原创 2016-06-16 14:02:47 · 594 阅读 · 0 评论 -
vijos1196(博弈论)
桌子上放着两堆糖果,Matrix67和Shadow轮流对这些糖果进行操作。在每一次操作中,操作者需要吃掉其中一堆糖果,并且把另一堆糖果分成两堆(可以不相等)留给对方操作。游戏如此进行下去,糖果数会越来越少,最后必将出现这样一种情况:某人吃掉一堆糖果后发现另一堆里只剩一块糖果不能再分了。游戏规定此时该操作者吃掉最后这一块糖果从而取胜。这个游戏是不公平的。对于任意一种初始状态,总有一方有必胜策略。原创 2016-09-15 10:36:52 · 590 阅读 · 0 评论 -
codeforces367(字符串hash求lcp比较大小,Trie解最大异或问题)
C:有n个字符串,排在一列,我们要求让这些字符串按字典序升序排列,对于一个字符串我们可以将它反转,有一个费用ci,求使升序排列的最小费用dp+log len的比较大小f【i】【0】表示不翻转,使前i个升序的最小费用f【i】【1】表示反转,使前i个升序的最小费用肯定是从f【i-1】【0】或【1】转移来的只要判断大小就可以了不过有个很关键的,文中说字原创 2016-08-12 09:31:45 · 563 阅读 · 0 评论 -
bzoj1996(区间dp)
这题只要知道是区间do,就不难做。首先f【l】【r】表示可以满足l~r这个区间的初始队形的方案数,显然我们发现,此时我们加入的队员,只有可能在最左边和最右边,也就是从f【l】【r-1】和f【l+1】【r】转移过来,但是由于我们加入的队员要和上一个队员进行比较,转移,但是f【l】【r】并不能表示,这好办,既然不能表示,就加一维,分情况呗。f【l】【r】【0】表示l~r,最后加入的是最左边的队原创 2016-08-18 14:24:45 · 579 阅读 · 0 评论 -
bzoj1040(图论+树形dp
刚开始以为是SB题,后来发现我是SB。。。。最开始问题:1.没有考虑会有森林的情况2:没有考虑到只有在环中断开两个点才能保证出现的是一棵树网上说的都太专业了,作为业余水平的选手感觉,其实这题就是,求多个(森林)树上的最大权独立集,但是这里的树上有且仅有一个环,直观来看,就是从u,v断开环,分两种情况,一种是选u,不选v,一种是选v,不选u。再就是那个简单的树形dp,我们想连边就原创 2016-08-18 13:32:05 · 426 阅读 · 0 评论 -
noip2015day2T2(wuwuwu
这题dp,好推,方程也不难列。就是dp的边界太恶心了,我就弱成这样,搞不清楚边界。还有,就是像这种,数据范围非常大的,就开一下滚动数组吧!感觉,被这道题down死了原创 2016-08-15 16:15:15 · 326 阅读 · 0 评论 -
dp再回顾之思路分析,及小知识点总结
dp题的步骤1、构造问题所对应的过程。2、思考过程的最后一个步骤(或一个),看看有哪些选择情况。3、根据这个选择情况化为子问题4、分析边界,考虑边界的各种处理方式5、写出状态转移方程要敢想,敢突破思维的束缚!!!!!原创 2016-06-13 16:09:57 · 977 阅读 · 2 评论 -
tyvj1089(dp,有的时候换一种角度,会有不一样的精彩)
有的时候换一种角度,会有不一样的精彩题目描述: 现有N个物品,第i个物品有两个属性A_i和B_i。在其中选取若干个物品,使得sum{A_i + B_i}最大,同时sum{A_i},sum{B_i}均非负(sum{}表示求和)。感觉上,a与b是并列的,实际上并列做,这样并不好理清状态,所以我们以其中一个作为,数组状态,另一个表示数组所存的值因为数组有负的情况出现,所以原创 2016-07-08 17:39:31 · 450 阅读 · 0 评论 -
bzoj1084(dp)
分了两种情况,m==1时,dp即可,关键是要注意负数的处理,有负数的时候,初始化为0就很可能有bugm==2时,想了一个dp,然而有一种情况没有考虑,codevs数据真是良心,给我留了90分,先贴自己的代码,然后重新写一下#include#include#includeusing namespace std;const int inf=0x3f3f3f;int f[1原创 2016-07-08 15:40:23 · 344 阅读 · 0 评论 -
hdu3001(3进制状态压缩dp)
和正常的没什么不同,就是一个点可以到两次,所以就用三进制来压并且,TSP的问题的状态表示都是dp【i】【k】,经过的点的集合表示为i,且现在走到k时的最短距离//同时,注意初始化最大值之类的,例如表示距离的,如果没有说就是最大值#include#include#include#include#includeusing namespace std;int n,a[12][1原创 2016-06-20 19:06:04 · 331 阅读 · 0 评论 -
poj1185炮兵阵地(状态压缩dp)
首先以后做棋盘的状压时,一定要预处理状态要注意积累位运算的技巧dp[i][j][k] 表示第i行状态为k,第i-1状态为j时的最大炮兵个数,i和i-1行 的状态由,i-1和i-2行推出,并且是要枚举i-2行的情况,非常经典的例题dp[i][j][k] =max(dp[i][j][k],dp[i-1][l][j]+cot[k]); cot[k]为k状态中1的个数 ;#incl原创 2016-06-20 16:29:26 · 268 阅读 · 0 评论