DP动态规划
文章平均质量分 64
JK Chen
ACM退役选手,战绩4金6银
展开
-
CCPC2020 威海C 树形dp
C Rencontre原创 2020-10-25 14:27:19 · 2686 阅读 · 5 评论 -
B - More Health Points(树形DP 斜率优化 斜率不单调)
https://vjudge.net/problem/ZOJ-3937题意:给出一棵根为1的树,每个点有点权(可能为负)。选出一条自上而下的路径,第iii个点(从上往下,1开始)计入的贡献为i∗a[i]i*a[i]i∗a[i],求max(0,最大值)解析:定义sum[p]sum[p]sum[p]为从1到ppp的权值之和,mul[p]mul[p]mul[p]为从1到ppp的贡献1∗a[1]+...k∗a[第k个点]1*a[1]+...k*a[第k个点]1∗a[1]+...k∗a[第k个点]。那么对于原创 2020-08-15 16:57:06 · 357 阅读 · 0 评论 -
HDU Tree(树形dp)
http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1007&cid=883题意:给一个树,边权。有一个整数k,找树的子图G,满足:G内连通、度大于k的顶点个数不大于1、总权值要尽可能大。解析:对于每个点,维护down[i]down[i]down[i]表示往下选择k−1k-1k−1个儿子(儿子也最多选择k−1k-1k−1个)的最大权值。接下来利用downdowndown维护出upupup数组,表示当前点为中心(可以大于K)时原创 2020-08-04 17:14:01 · 243 阅读 · 0 评论 -
Harmony Pairs(数位dp)
https://ac.nowcoder.com/acm/contest/5671/H解析:dp[i][j]dp[i][j]dp[i][j]表示iii位数十进制和为jjj的方案数limit[i][j]limit[i][j]limit[i][j]表示被限制(前面都到达上限,即第1位需要小于等于对应位置数字)的iii位数十进制和为jjj的方案数sum[i][j]=∑k=1jdp[i][k]sum[i][j]=\sum_{k=1}^jdp[i][k]sum[i][j]=∑k=1jdp[i][k]ans原创 2020-07-27 17:29:23 · 285 阅读 · 0 评论 -
Radio Prize(树形dp)
https://nanti.jisuanke.com/t/45344题意:给一棵树,点权tititi,带边权。对于每个点,求∑i=1n(ti+tp)disip\sum_{i=1}^n(t_i+t_p)dis_{ip}∑i=1n(ti+tp)disip。解析:分成两部分:tpdisipt_pdis_{ip}tpdisip:维护其他点到这个点的dis之和tidisipt_id...原创 2020-05-05 14:27:56 · 359 阅读 · 0 评论 -
4.2美团笔试题3(dp)
题意:p[i]代表一次使用i颗子弹成功的概率,v[i]代表一次使用i颗子弹成功后获得的值。你有n颗子弹,每次可以选择使用任意颗子弹。成功后继续,失败后结束。问期望的最大值。解析:代码没有保留,说一下过程。其实就是简单的dp,dp[i]是用了i颗的期望值。转移方程:dp[i]=p[i−j]∗(dp[j]+v[i−1])dp[i]=p[i-j]*(dp[j]+v[i-1])dp[i]=p[...原创 2020-04-02 21:24:48 · 3087 阅读 · 6 评论 -
D - Dinner Bet(概率论 dp 数学推导)
http://codeforces.com/gym/101174/attachments题意:给两堆c个球in[1,n],每次随机选出d个求in[1,n],将两堆球中出现在这d个球的球删去,某堆空时结束,问期望次数。解析:显然,将球分为4种,A:第一堆独有,B:两堆共有,C:第二堆独有,D,其他dp[I][J][K]表示ABC三堆分别已经有I,J,K个的期望步数。考虑一步:dp[I][...原创 2020-03-29 16:34:59 · 677 阅读 · 0 评论 -
D - Delta Quadrant(树分治 树形dp)
题意:给一棵树,你选择一个点开始,将n-k个点vis后回到这个起点的最短时间。边权,每个点可多次访问。k最大20。解析:就是找出一个n-k个点的子图,使边权和最小。可以树分治,每次处理很简单,就是一个树形dp而已。dp[i][j]表示到点i,删除j个点的最少边权。代码:...原创 2020-03-21 17:05:41 · 230 阅读 · 0 评论 -
E. Nanosoft(dp)
http://codeforces.com/problemset/problem/1301/E题意:给出一个图,一个合格的正方形为左上角R,右上角G,右下角B,左下角Y,各占1/4。每次询问给出的长方形面积内的最大合格正方形。解析:数据结构想不出,dp做是水题。处理dp[i][j][len]dp[i][j][len]dp[i][j][len]以(i,j)为左上角len长度的正方形区域内的...原创 2020-03-20 14:50:18 · 127 阅读 · 0 评论 -
D. Happy New Year(dp)
http://codeforces.com/problemset/problem/1313/D题意:n个线段,对于所有线段,每个点至多被k个线段覆盖。现在选择一些线段,计算答案为被覆盖奇数次的点的数量。求最大值。解析:对于[L,R][L,R][L,R],将L和R+1加入vector后排序,然后逐个处理。维护dp数组,由于每个小段只会被覆盖K个大段,所以对于这些大段编号。如果到达新的大段...原创 2020-03-17 13:22:23 · 271 阅读 · 0 评论 -
F2. Animal Observation (hard version)(线段树 dp)
http://codeforces.com/problemset/problem/1304/F2题意:n*m,每行可以放(往下)一个2行k列的长方形,问被覆盖的数字和最大是多少。(n≤50,m≤2e4,k≤mn\leq 50,m\leq 2e4,k\leq mn≤50,m≤2e4,k≤m)解析:考虑dp[i][j]dp[i][j]dp[i][j]为以(i,j)(i,j)(i,j)为左上...原创 2020-03-05 10:52:12 · 229 阅读 · 0 评论 -
UCF Local Programming Contest 2015 H. Reach for the Stars(状压dp)
https://nanti.jisuanke.com/t/43393题意:解析:对于第i行放置十字的情况,前面的行能影响的区域为红色区域。也就是14个格子。对于第i行,有7个位置可以填十字。由于左右两个格子是否为空直接影响两边的十字能否填,所以有5个十字。dp[i][s1][s2]dp[i][s1][s2]dp[i][s1][s2]表示填完第i行,第i行的7个位置的状态为s1,第i+1...原创 2020-02-27 09:56:54 · 391 阅读 · 0 评论 -
D. Tree Elimination(树形dp)
http://codeforces.com/problemset/problem/1276/D题意:给出一棵树的边,按照给出的顺序决策所有边。如果两个点都没被选择,选一个。否则不操作。问选择的序列的可能情况数。解析:因为一条边的决策只会影响相邻的边的决策,所以可以树形dp,从下到上,父亲从儿子转移。dp[0]dp[0]dp[0]表示这个点被父亲边之前的儿子边选中;dp[1]dp[1]d...原创 2020-02-25 09:47:42 · 395 阅读 · 0 评论 -
C. Xenon's Attack on the Gangs(树形dp)
http://codeforces.com/problemset/problem/1292/C题意:给出一棵树,n个点,你将0至n-2这n-1个数填到每条边上。一条路径的权值为最小的没有出现过的自然数,求所有路径的权值和的最大值。解析:没有出现过的自然数,可以这么理解,如果这条路径上包含了0、1,那么权值为2。也就是说,答案变为:包含0的路径数+包含01的路径数+包含012的路径数+……...原创 2020-01-25 15:38:45 · 1523 阅读 · 1 评论 -
D. Road Improvement(逆元0的情况 树形dp)
http://codeforces.com/problemset/problem/543/D题意: 一棵树,每条边可以坏、可以好,你现在要得出每个点出发的情况下,到达其它每个点的路径上最大一条坏边的方案数。解析:先预处理每个点出发,到子树中每个点的方案数:dp[fa]=∏(1+dp[son])dp[fa]=\prod (1+dp[son])dp[fa]=∏(1+dp[son]),即可以选择连...原创 2019-11-08 21:26:31 · 331 阅读 · 0 评论 -
E. Lucky Arrays(dp 非互质求逆元)
http://codeforces.com/problemset/problem/256/E题意:一个字符串有123构成,给出3*3矩阵代表每个数字之后可以跟的数字。初始全0,代表可以任意取,然后每次操作会改变一个位置。求每次操作后的可行合法字符串方案数。解析:首先可以预处理dp[len][i][j]dp[len][i][j]dp[len][i][j]表示长度为lenlenlen,以数字i...原创 2019-11-05 16:18:23 · 872 阅读 · 0 评论 -
D. Sweets for Everyone!(dp 线段树 复杂情况考虑)
http://codeforces.com/problemset/problem/248/D题意: 有一个字符串,包含H,点和S三种字符,其中H代表人,S代表超市。你现在花了一分钟到达了最左边的点。两个点之间的移动花费一分钟。每个H需要这个糖果,每个S可以出售一个糖果。现在给出时间t,求最少的初始糖果数量,可以在规定时间内让每个H得到糖果。解析:显然二分初始值val,并且显然我到达一个H时如...原创 2019-10-31 16:43:29 · 161 阅读 · 0 评论 -
E. Another Filling the Grid(dp 方案数)
http://codeforces.com/problemset/problem/1228/E题意: 给出n*n矩阵,可以填[1,K],要求每一行每一列都至少有一个1,问方案数。n最大250。解析: 想办法用较少的状态表示所有方案是解决这类问题的key。我们可以用dp[i][j]表示到了第i行,已经有j列有1的方案数。转移式子为dp[i+1][j+k]+=dp[i][j]∗Cn−jk∗Kj∗...原创 2019-10-24 15:22:36 · 201 阅读 · 0 评论 -
F. Yet Another Substring Reverse(状压dp)
http://codeforces.com/problemset/problem/1234/F题意: 一个n的字符串,字符集最多20。现在可以翻转一个子串,使得最长字符各不相同子串的长度最大。解析: 由于只需要字符各不相同,所以两个不相交的子串可以通过翻转连接。而两个字符集不同的子串显然不会相交,所以可以直接枚举一个状态x,求出x的补集的子集中,字符最多的那个。代码:#include<...原创 2019-10-24 14:36:32 · 279 阅读 · 0 评论 -
E. Balanced Binary Search Trees(记忆化搜索 树上某个点的某层儿子)
http://codeforces.com/problemset/problem/1237/E题意: 构造一棵n节点(1到n)的二叉搜索树,要求深度之和最小,且对于每个节点,与其左儿子奇偶性不同,右儿子相同。求方案数。解析: 由于要求深度最小,所以对于一个序列一定是以中间点作为根,以平分两边。对于一个段[L,R],可以用三种信息表示:L的奇偶性,固定好的中点的奇偶性,段的长度。搜索比较简单,直...原创 2019-10-23 17:45:42 · 340 阅读 · 0 评论 -
dp NOIP2006提高 能量项链
原题:能量项链题意:两个珠子两个数字,第一个为2 3,第二个为3 5,那么我们可以合并这两个珠子,变成2 5,得到2*3*5的能量。现在给一串珠子(首尾相连成一个环),我们可以任意合并两个珠子,求把这一串珠子合并成一个的时候得到的最大能量。解析:这个题因为每次可以任意选择两个珠子合并,所以有n!的可能性,不能暴力,需要用dp来做。(因为从最后一个开始合并的话需要前面的数,所...原创 2018-02-26 11:31:57 · 356 阅读 · 0 评论 -
最大顶点数的凸多边形
原题:POLYGON题意:在第一象限有n个点,用这些点再加上原点构成一个凸多边形(原点必须选),求顶点数的最大值。思路:用dp[i][j]表示以i为最后第二个点,j为最后一个点所能构成的最大顶点数。对于所有的点,按照其斜率排序,以节省时间。然后规定第0个点和第n+1个点为原点,因为要从原点出发,再回到原点。对于一次操作,假设定下前面两点(1,2),对于后面的一个点(3),判...原创 2018-02-26 07:51:05 · 905 阅读 · 0 评论 -
石子合并,四边形优化,garsiawachs算法
题目分析原题:石子合并题意:在操场上沿一直线排列着n堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的两堆石子合并成新的一堆, 并将新的一堆石子数记为该次合并的得分。允许在第一次合并前对调一次相邻两堆石子的次序。 计算在上述条件下将n堆石子合并成一堆的最小得分。解析:简单dp,用dp[i][j]表示合并i~j的最小得分,合并两个dp时,新的dp==两块的已有得分加上i...原创 2018-02-21 17:54:13 · 598 阅读 · 0 评论 -
青蛙过桥 DP,压缩
原题:青蛙过河题意:长为L的桥,上面有M个石子,青蛙从1点开始,每次跳的范围为[S,T],求过河所要踩的石子数的最小值。解析:在dp的角度这题非常简单,(从i点跳j步,Map[i+j]为1时代表此处有点)dp[i+j]=min(dp[i]+Map[i+j],dp[i+j]),求最小值的dp只需对dp数组附一个很大的值,再dp[0]=0,就可以完成。难点是L最高10^9,但是只有...原创 2018-02-21 11:51:29 · 684 阅读 · 0 评论 -
多重背包及完全背包优化
今天大年初一,在这里祝广大love_leraning新年快乐!多重背包定义:给定n种物品和一背包。物品i的重量是wi,其价值为vi,每件物品的数量为xi,背包的容量为m。思路:即在01背包的基础上加上一遍数量的循环,把每个物品的每件都看成不同的即可。伪代码:for(i=0;i&lt;n;i++) for(j=m;j&gt;=w[i];j--) for(k=1;k...原创 2018-02-15 13:08:43 · 590 阅读 · 0 评论 -
多重背包方案数的求解
原函数求解多重背包方案数原题:找单词题意:有x1个字母A, x2个字母B,….. x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,….. 字母Z的价值为26。那么,对于给定的字母,可以找到多少价值&lt;=50的单词(ABC和ACB视为一个单词)。分析:拿出k个单词价值i,可以使dp[j]转化为dp[j+k*i](dp[i]表示价值和为i的方案数),比如有3个B(价...原创 2018-02-15 12:02:11 · 2311 阅读 · 0 评论 -
dp 括号序列
原题:括号序列【基础算法・动态规划】——高级题意:给一个字符串,用最小的字符把它补成规则序列。定义如下规则序列(字符串):空序列是规则序列;如果S是规则序列,那(S)和[S]也是规则序列;如果A和B都是规则序列,那么AB也是规则序列。解析:首先是判断串里面,在删减一部分后所能形成的最长规则序列,例如()[]((,最长的规则序列为()[]为4。这个就是最经典的括号...原创 2018-02-26 12:50:51 · 596 阅读 · 0 评论 -
dp 状态压缩
知识:位运算例题有一个N*M(1&lt;=N&lt;=5,1&lt;=M&lt;=1000)的棋盘,现在有1*2和2*1的小木块无数个,要想盖满整个棋盘,会有多少种可行的方法?因为N比较小,而每个位置都只要两种可能,放于不放,所以我们可以用一个二进制数来代表一列,例如4(00100)代表只有第3个位置有放。想法有了,接下来是实现。因为方块只有2格长度,所以在i行放方块最多只...原创 2018-02-26 23:36:57 · 263 阅读 · 0 评论 -
多人背包
原题:1337题意:n样物品,k个背包,背包大小为v,每个物品无限数量,但是每个包里不能出现相同物品,且每两个包放的东西不能完全一样,求k个包所能装下的最大价值量。思路:说白了,01包求的是最大值,现在求的是前k种最大方法。我们在dp[i]表示i大小背包所能装的最大值的基础上加一维dp[i][j]表示i大小装的第j大的装法。01包每次装下一个物品的时候,我们就维护dp[i]...原创 2018-03-08 14:40:33 · 602 阅读 · 0 评论 -
整数划分相乘
原题:1186 乘积最大题意:整数划分成多部分相乘解析:根据区间dp的思想,我们定义dp [ i ] [ j ]为从开始到 i 中加入 j 个乘号得到的最大值。 那么我们可以依次计算加入1—-m-1个乘号的结果 而每次放入x个乘号的最大值只需枚举第x个乘号的放的位置即可 dp [ i ] [ j ] = MAX (dp [ i ] [ j ] , dp [ k ] [ j-...原创 2018-03-14 22:32:40 · 492 阅读 · 0 评论 -
数位dp
数位dp,就是用一个dp[i][j]代表第i位为j中的符合条件的数的个数,例如dp[2][3]就代表了30~39中的数。而状态转移方程是dp[i][j]+=dp[i-1][k](k属于0~9),例如dp[2][3]+=dp[1][0~9],30~39的数可以通过0~9转移。而在求到从0到一个数范围内的时候,我们对于这个数的每一位都设置一个上界,213的上界为2,1,3。通过dp数组把213分为...原创 2018-03-05 09:02:33 · 347 阅读 · 1 评论 -
可上升字符串
原题:1176题意:给出一个按字典序排序好的字符串序列,从中按顺序选出多个字符串,组成一个句子,每个字符串都可以通过改变一个字符,删除,添加一个字符得到相邻的字符串Sample Inputcat dig * dog fig * fin * fine * fog log wine *Sample Output5思路:对于每个输入的字符串,我们可以枚举这个...原创 2018-03-05 18:56:19 · 427 阅读 · 0 评论 -
邮局问题
原题:POJ 1160题意:一些村庄被建立在一条笔直的高速公路边上,我们用一条坐标轴来描述这条高速公路,每一个村庄的坐标都是整数,没有两个村庄坐标相同。两个村庄间的距离,定义为它们的坐标值差的绝对值。我们需要在一些村庄建立邮局——当然,并不是每一个村庄都必须建立邮局,邮局必须被建立在村庄里,因此它的坐标和它所在的村庄坐标相同。每个村庄使用离它最近的那个 邮局,建立这些邮局的原则是:所有村...原创 2018-03-29 21:12:38 · 4790 阅读 · 2 评论 -
土地租用 dp 斜率优化
n==1000 简化版题意:有长宽已给出的n组矩阵,自由分组,每组的花费为最长的长和最长的宽的乘积,求最小花费解析:如果有(3,5)的矩形,那么长小于3宽小于5的所有矩形都可以0花费的塞到这个矩形的组里,所以首先删除掉这些多余的矩形,剩下的矩形按照长升序,宽降序排列设i的长为l[i],宽为r[i],前i个矩形的最优解为dp[i],对于第i个矩形,很明显可以得出dp[i]=min...原创 2018-04-14 17:27:50 · 346 阅读 · 0 评论 -
摇钱树 dp
原题:zjnu 1209题意:有n堆钱,给出每堆的初始数量和消失速度,你可以拿走k堆钱,每拿走一堆,所有剩下的钱就会按照消失速度减少,求k天所能拿的最大金额解析:拿哪堆最好呢?第一个因素是初始金额大,第二个因素是消失速度小,而到底怎么在这两种因素中做一个抉择,是这题的难点假设n堆我们都可以拿走,那么肯定是先 拿消失得快的那堆, 那如果现在多出第n+1堆,且比前n堆的消失速度都...原创 2018-04-05 09:29:05 · 412 阅读 · 0 评论 -
顺序对齐
原题:zjnu 1273题意:解析:用dp[i][j]表示匹配到第一个串前i个,第二个串前j个的最大得分对于i,j,有以下几种可能a[i]==b[j],那么dp[i][j]=dp[i-1][j-1]+2,这种情况一定是当下最优解,可continue了不相等时,第一种情况是直接让i和j处于不匹配状态,dp[i][j]=dp[i-1][j-1]第二种是在dp[1~i][j...原创 2018-04-05 21:55:43 · 659 阅读 · 0 评论 -
尼克的任务
原题:zjnu 1293题意:给出总时间t和任务数k 每个任务有一个开始时间和持续时间,每个尼克手头没任务的时刻,都要从这个时刻开始的几个任务中选择一个开始任务,求最大的空闲时间解析:从后往前dp,dp[i]表示从i到最后最大的空闲时间,假设i时刻没有任务,dp[i]=dp[i+1]+1,如果有,dp[i]=max(dp[i]+time[k]),即枚举每个任务结束后那个时刻的空闲...原创 2018-04-05 22:29:10 · 213 阅读 · 0 评论 -
状压dp 天上掉Pizza
原题:zjnu 1192题意:买了一种披萨后会得到其他披萨的优惠券,问怎么卖能使单位面积的披萨价格最小(买一个两个随意)解析:如果dp题做成了顺序题,就很难绕出来了正确做法应该是枚举状态,由之前的状态转移而来。但是如果在想谁先谁后买,就是走歪路了dp[i]表示状态为i时最小花费,eg:5个披萨i==29(11101)表示买了1、3、4、5种披萨的状态,状态转移方程为dp[i...原创 2018-04-13 13:10:01 · 366 阅读 · 0 评论 -
任务安排
原题:zjnu 1274题意:给定多个任务的顺序,分组,每组开始时有s秒的前摇,每个任务有一个f,花费为这一组结束时间*f,求最小的总花费解析:题目简单,但是状态转移方程比较难想到dp[i]表示前i个的最小总花费+因此而产生的后续多出来的s,因为假设在一组划分到j为止,对于j后面的所有任务,结束时间会往后延s(相对j后面不划分的情况),多出来的花费就是( f[n]-f[j] )...原创 2018-04-13 14:29:31 · 726 阅读 · 0 评论 -
钓鱼
简化版原题:zjnu 1286题意:x轴上有连续的n个鱼塘,每个鱼塘开始五分钟可以得到f[i]的鱼,每获得五分钟的鱼,获得鱼的数量减少d[i],到0为止,第i个鱼塘前位第i+1个鱼塘的时间为t[i]*5,问h小时可以获得的最多的鱼解析:dp的做法,dp[i][j]表示j个5分钟后呆在i鱼塘的最优解状态转移方程:dp[i][k]=dp[i-1][k-t[i-1]]:k时...原创 2018-04-19 18:51:33 · 1017 阅读 · 0 评论