![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP每日训练
玛珈山大萌新
破山中贼易,破心中贼难。不破不立,破而后立,立而为人。
展开
-
[概率dp]P1654 OSU!
题目:P1654 OSU!分析:代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗//typedef __int128 lll;#define print(i) cout << "debug: " << i << endl#define close() ios::sync_with_stdio(0), cin.t原创 2021-02-04 21:25:52 · 103 阅读 · 0 评论 -
[树形dp]P3174 [HAOI2009]毛毛虫 题解
题目:P3174 [HAOI2009]毛毛虫分析:dp[i]表示考虑以i为根节点的子树,以i为头构成的最大毛毛虫。每个点贡献答案时,要考虑左右两条链加上相邻点(注意:有父节点的话父节点也算!)代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗//typedef __int128 lll;#define print(i) cout <<原创 2021-02-04 17:54:32 · 270 阅读 · 0 评论 -
AtCoder Beginner Contest 189
题目:F - Sugoroku2分析:这道题不算太难,就是个解方程,还有就是浮点精度。f[i]表示从i到终点的期望步数x[i], y[i] = sumf(i +1, … i + m) / m + 1 = x * f[0] + y每次维护滑动窗口内的x和y,最后根据f[0] = x * f[0] + y即可求出f[0]对于无解的情况,要用eps判断。代码:#include <bits/stdc++.h>using namespace std;typedef long long原创 2021-01-25 15:47:16 · 77 阅读 · 0 评论 -
[DP训练]P4342 [IOI1998]Polygon
题目:P4342 [IOI1998]Polygon分析:这道题就只有一点需要注意:不能只用一个dp[i][j](最大值)来转移,因为子状态可能为负,会影响转移,因此还要再开一个dpmin维护最小值。(又被卡了一会,还是太菜了,啥时候随手切蓝题)代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗//typedef __int128 lll;#def原创 2021-01-19 22:09:16 · 92 阅读 · 0 评论 -
[dp]Misunderstood … Missing Gym - 102056I
题目:链接分析:分析代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll;#define print(i) cout << "debug: " << i << endsl#define close() ios::sync_with_stdio(0), cin.tie(0原创 2020-11-30 19:42:25 · 108 阅读 · 0 评论 -
[Dp每日训练]送外卖2
题目:送外卖2分析:每个任务有三个状态,未开始,已开始未结束,已结束。考虑状压。dp[i][j]表示所有任务的状态,将每个任务用三进制表示成i,j表示此时在j点,所花费的最少时间。状态转移的时候先枚举每个任务,然后枚举转移过来的点。代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll;#define原创 2020-11-26 11:42:23 · 182 阅读 · 0 评论 -
A - Girls Band Party 计蒜客 - 42381(银川站-分组背包)
题目:A - Girls Band Party 计蒜客 - 42381分析:首先是分组背包,然后考虑如何设置状态。分组最多1e51e51e5,所以后面的状态不能太大。挖掘题目的含义,设加成分别是1和2,则总的加成不超过15,而且总的选的物品为5,因此得到后面两维。将物品按name分组之后,dp[i][j][k]表示考虑前i个组,恰好选了j个物品且加成恰好为k,所能获得的最大分数(先不考虑加成)。状态转移极其简单,这里不赘述了,直接看代码。注意:设状态的时候一定要表明是恰好还是最多,这会导致初始原创 2020-11-15 23:45:05 · 173 阅读 · 0 评论 -
2019ACM/ICPC上海网络赛 F Rhyme scheme
分析:思路:我们可以画一颗这样的树先。观察这一颗树,可以发现,每个结点如果按字典序安排子结点,那么叶子节点一定是从1~Bn的顺序。那么,随意观察一条路径,一个结点可以出现字母x当且仅当其祖先结点出现了字母x-1,也就是说,由第一层到当前层的出现字母的最大值为x或x-1,才可以在当前结点放x。如果我们将dp[i][j]表示成在第i层,已出现的最大字母为’A’+j-1,那么, 有状态转移方程dp[i][j] = dp[i+1][j]*j + dp[i+1][j+1].这个转移方程的含义是,在第i原创 2020-11-09 16:35:02 · 73 阅读 · 0 评论 -
[背包dp]P4095 [HEOI2013]Eden 的新背包问题
题目:P4095 [HEOI2013]Eden 的新背包问题分析:这个题是扣除一类物品的多重背包,可以正向、逆向跑两次多重背包(用二进制优化),然后对于扣除的位置pospospos,枚举两侧的体积,求最值。代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll;#define print(i) cout &原创 2020-10-28 15:10:50 · 111 阅读 · 0 评论 -
[背包dp][AHOI2013]找硬币
题目:[AHOI2013]找硬币分析:贪心:由于硬币之间都是倍数关系,所以优先放大硬币。dp[i]表示最大面值为i的答案。枚举方式:先枚举次大硬币值iii,再枚举最大值是次大的jjj倍,然后算一下每个硬币减少量即可。代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll;#define print(i)原创 2020-10-28 11:53:18 · 153 阅读 · 0 评论 -
[背包dp]小明打联盟
题目:小明打联盟分析:这个题是一个完全背包问题,对于大招,我们有三种选择:l,l+i,rl, l + i, rl,l+i,r,最终的方案中l+il + il+i最多出现一次,于是先用前三个物品+l+r前三个物品+l + r前三个物品+l+r这五个物品跑完全背包,然后用l+il + il+i更新一遍dp[v]dp[v]dp[v]代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开原创 2020-10-27 22:00:44 · 156 阅读 · 0 评论 -
[树形dp-贪心][HNOI2003]消防局的设立
题目:[HNOI2003]消防局的设立分析:这题是三星题??不就是个简单贪心吗?好吧,贪心、dp两两不分家,看来刷dp还是能练很多方面的能力的。很容易的分析出来,对于整棵树最深的叶子结点u,我们肯定选fa[fa[u]],而不选u。这样对于整棵树,我们可以每次选取深度最深的点u,然后染色他的祖父。可以用优先队列实现。这题竟然是三星???是三星??代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;/原创 2020-10-26 18:05:23 · 352 阅读 · 3 评论 -
[2020 China Collegiate Programming Contest Weihai Site - 重现赛] L Clock Master
分析:这个题是一个分组背包问题。v=a1p1+a2p2+...+anpnv = a1^{p1}+a2^{p2}+...+an^{pn}v=a1p1+a2p2+...+anpn每一个质因数的幂次的集合就是一个分组。代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll;#define print(i) cou原创 2020-10-26 16:58:46 · 336 阅读 · 1 评论 -
[树形dp][HAOI2015]树上染色
题目:[HAOI2015]树上染色分析:dp[i][j]表示第i个点染j个黑色时的对答案的最大贡献。这里我们采用“合并法”求dp,即将两个子问题合并算大问题的答案。代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll;#define print(i) cout << "debug: " &l原创 2020-10-26 08:55:03 · 137 阅读 · 0 评论 -
[树形dp][FJOI2014]树的重心(100行dp,胆小慎入)
题目:[FJOI2014]树的重心分析:这题在牛客网才三星?那五星就是final金牌题了呗?我人没了。放弃分析,日后复习,感觉好题。参考博客代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll;#define print(i) cout << "debug: " << i &l原创 2020-10-23 16:57:38 · 159 阅读 · 0 评论 -
[树形dp][CQOI2009]叶子的染色
题目:[CQOI2009]叶子的染色分析:根可以随便选一个非叶子结点。dp[u][k]表示u结点染成k色使得u子树合法的最小染色数。可以想到如果u的孩子v染了k色,那么v的k色完全可以染在u上,不需要染v。可以得到转移方程:代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll;#define pri原创 2020-10-21 20:42:38 · 158 阅读 · 0 评论 -
[2020 China Collegiate Programming Contest Qinhuangdao Site-重现赛]7-11 Kingdom‘s Power
分析:设dp[u]表示假设兵营建在u点,征服u子树的最少时间,先上个图。贪心的策略是:先访问深度较小的u的子树vi,然后考虑次浅的子树vj的时候,兵来源有两个,一个是root,一个是vi最深的孩子,两者取较小的即可。代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll;#define print(i)原创 2020-10-21 20:28:31 · 343 阅读 · 4 评论 -
[树形dp]选点
题目:选点分析:看似是树形dp,其实是个LIS考虑到父节点跟左右儿子的大小关系,将三者按根、右儿子、左儿子排成一个数组,然后跑LIS即可,太妙了,我又没想出来。代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll;#define print(i) cout << "debug: " <原创 2020-10-21 14:59:33 · 101 阅读 · 1 评论 -
[树形dp + 组合数学]蓝魔法师
题目:蓝魔法师分析:dp[i][j]表示对于i这个子树来说,i所在的连通块大小为j,并且整棵树合法的方案数。接下来就是类似背包的解法了。遍历每个儿子的分支,每个分支要么删除,要么不删除。1.删除:删除此边,那么就意味着当前以u节点连通块大小为k的方案数 都可以 乘 v节点连通块大小所有的方案数:2.不删除不删除就相当于合并那么此时直接跑两个循环即可:for(int i=1;i<=min(sz[u]*1ll,m);i++){ for(int k=1;k<=min(sz[e原创 2020-10-21 11:39:30 · 146 阅读 · 1 评论 -
[树形dp + 换根]Tree
题目:Tree分析:这个题第一步很好想,求出每个子树的答案。难的是如何求u上方的贡献。(引用)代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll;#define print(i) cout << "debug: " << i << endl#define clo原创 2020-10-20 21:24:20 · 97 阅读 · 0 评论 -
[树形dp]旅游
题目:旅游分析:一道2星的题,一开始还想成贪心找叶子,太菜了。dp[i][0/1]表示不选/选当前结点的最大时间还是菜,毕竟树形dp做的太少了代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll;#define print(i) cout << "debug: " << i &原创 2020-10-20 19:28:35 · 103 阅读 · 0 评论 -
[树形dp+贪心]黑白树
题目:黑白树分析:叶子结点一定选,从下往上,对于当前u维护一个如果再选一个子节点能够往上最远的距离maxlen,和不选u能够向上到达的最远距离nowlen。当nowlen=0时,就不得不选一个点(这里我们不关心选了哪个点),使得nowlen = maxlen代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 ll原创 2020-10-20 17:40:15 · 108 阅读 · 0 评论 -
[区间dp][HAOI2008]玩具取名
题目:[HAOI2008]玩具取名分析:简单的区间合并,因为最终结果的长度最多为4,所以dp设为3维,dp[i][j][k]表示[i, j]区间内能否由k这个字母产生。代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll;#define print(i) cout << "debug: " &原创 2020-10-19 21:24:44 · 153 阅读 · 0 评论 -
[区间dp]合并回文子串
题目:合并回文子串分析:dp[i][j][k][p]表示a串的[i, j]和b串的[k, p]能否通过交叉且保持原有顺序不变形成回文串。4维dp, 先枚举长度,再枚举位置,状态合法则贡献答案。代码:#include <bits/stdc++.h>using namespace std;typedef long long ll;//三年竞赛一场空,不开long long见祖宗 //typedef __int128 lll;#define print(i) cout <<原创 2020-10-19 11:56:27 · 123 阅读 · 0 评论