
动态规划系列
文章平均质量分 68
phython96
ACM退役~
展开
-
区间dp专题
区间dp专题基本思想区间dp一类的问题往往子问题具有很明显的区间性质,也就是说我们可以通过将子问题定义为整个区间的一个子区间.因为一个大区间可以切分成两段相邻的子区间.从这点出发,我们便可以找到递推关系.1.纸牌游戏蜘蛛牌游戏规则是这样的:只能将牌拖到比它大一的牌上面(AAA最小,KKK最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起移动,游戏的目的是将所有的牌按同一花色从小...原创 2019-03-15 23:52:36 · 270 阅读 · 0 评论 -
2018-2019 ACM—ICPC SEERC 题解
2018 - 2019 SEERC 题解比赛发出来太新了,网上根本就搜不到题解,补题补的太难受了.在这里分享一篇我自己写的题解,也方便别人补题.题目链接http://codeforces.com/gym/101964/attachments/download/7814/seerc-2018.pdfA.Numbers留坑.B.Broken Watch题解先考虑三个针长度各不...原创 2018-11-01 14:05:40 · 6248 阅读 · 2 评论 -
Wannafly 挑战赛27 题解
Wannafly 挑战赛27题目连接https://www.nowcoder.com/acm/contest/215#questionA.灰魔法师题目题解考虑到可能的完全平方数只有400400400多个,因此对于每种数,直接暴力枚举所有的完全平方数计算一下就可以了.代码#include <iostream>#define int long longconst i...原创 2018-10-29 10:00:49 · 260 阅读 · 0 评论 -
NCPC2018 D.Delivery Delays[二分答案+DP check]
Delivery Delays题意100010001000个点,500050005000条边的无向图,披萨店在111号店.100010001000份披萨订单,每个订单有下单时间,送达地点,披萨制作出来的时间.你是快递员初始在111号点,每次可以拿无穷多披萨,送完以后返回111号点继续送,送餐的时候要求按照下单顺序送达,求等待时间最长的顾客的最小等待时间.题解其实这道题不难,读题的时候读漏了...原创 2018-10-27 15:37:11 · 691 阅读 · 0 评论 -
HDU5322 - cdq分治FFT加速dp
5322 Hope [CDQ分治FFT计算计算dp]题意每一个每一个排列,排列中每个数向它后面第一个比它大的数连一条边.每个排列对于答案的贡献是这个排列所生成的图中的每一个联通量中点的个数的平方之积.例如:排列1,2,3,6,4,51,2,3,6,4,51,2,3,6,4,5其中1,2,3,61,2,3,61,2,3,6形成一个大小为444的联通分量.4,54,54,5形成一个大...原创 2018-10-21 00:24:39 · 343 阅读 · 0 评论 -
Wannafly挑战赛24
Wannafly挑战赛24题目连接https://www.nowcoder.com/acm/contest/186#questionA.石子游戏题解注意到当石子个数为偶数的时候,每回合都会减少一堆偶数石子,因此,先手必胜.我们可以不考虑奇数堆石子,因为必胜方始终可以动偶数堆.当必败方将奇数堆分成一堆偶数和一堆奇数的时候,必胜方将新生成偶数堆移动到原有的偶数堆中即可抵消对方的移动....原创 2018-10-20 10:41:21 · 232 阅读 · 0 评论 -
Wannafly挑战赛26 题解
Wannafly挑战赛26题目连接https://www.nowcoder.com/acm/contest/212#questionA. 御坂网络枚举圆心所在的位置,O(n)O(n)O(n) 检查即可,总时间复杂度为O(n2)O(n^2)O(n2)B. 冥土追魂这题比较坑,我感觉题意叙述有问题,总之也是一道水题,题解略去.C. 七彩线段题解考虑到只有777种颜色,因此可以枚举最后...原创 2018-10-19 08:23:42 · 322 阅读 · 0 评论 -
虚树-树上动态规划的利器
虚树问题引入在一类树上动态规划问题中,题目给出的询问往往包含树上的很多各节点,并保证总的点数规模小于某个值.如果我们直接在整颗树上进行dpdpdp的话,时间复杂度与询问的次数有关,这显然是不可接受的,如果我们可以找到一种动态规划的方法,使其时间复杂度与询问中点的实际规模相关就好了.于是虚树应运而生.虚树概念虚树即是一颗虚拟构建的一棵树,这个树只包含关键点以及关键lc...原创 2018-09-17 16:34:31 · 8619 阅读 · 5 评论 -
CERC2017 Gambling Guide,最短路变形,期望dp
题目链接题面链接题意给定一个无向图,你需要从111点出发到达nnn点,你在每一点的时候,使用111个单位的代价,随机得到相邻点的票,但是你可以选择留在原地,也可以选择使用掉这张票,问到达nnn点的最小代价的方案的期望是多少。题解我们先假定在最优方案下从每个点xxx出发,到达nnn点的代价的期望为exexe_x,那么显然,我们可以列出方程ex=∑min(ex,ey)degx+...原创 2018-06-03 17:37:06 · 968 阅读 · 0 评论 -
2017 ACM Jordanian Collegiate J.Efficiency Test 动态规划、类倍增
题目题目链接题解及代码#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N = 1e5+7;int f[2*N][55],a[2*N],sum[2*N],ans[2*N],pb[2*N];int T,n,k;...原创 2018-05-17 22:02:07 · 179 阅读 · 0 评论 -
P2468 [SDOI2010]粟粟的书架 动态规划,主席树,二分答案
题目洛谷题目链接题解题目的数据范围非常奇怪,一半是200∗200200∗200200*200的矩阵,另一半是1∗500001∗500001*50000的矩阵,显然是一道二合一的题目,但是不一样的地方也就在与数据结构的选择不一样,而我们解这道题使用的算法是一样的,即都是二分法。这道题所需要的数据结构应该能提供如下的功能:在O(1)O(1)O(1)或O(logn)O(logn)O(...原创 2018-05-07 16:56:08 · 247 阅读 · 0 评论 -
洛谷P2501数字序列 动态规划
题目题目链接题解这道题目我觉得是神题,非常有意思的题目,也挺难做的。第一问:求最少需要改变的数量这一问比较简单,之前也见过这种套路。 定义dp[i]dp[i]dp[i]表示aaa序列中a[1,i]a[1,i]a[1,i]部分构成严格递增子序列且以a[i]a[i]a[i]为结尾所不需要改变的最大的数量。 那么转移方程就是: dp[i]=min1≤j<i,a[i...原创 2018-04-19 13:30:05 · 364 阅读 · 0 评论 -
洛谷-省选斗兽场-动态规划1
记练习一下动态规划水题系列,防止脑子生锈。P1879 玉米田题解非常典型的状态压缩DPDPDP,先预处理出所有可行的状态SSS。 然后逐行DPDPDP,定义状态dp[i][S]dp[i][S]dp[i][S]表示的含义是前iii行满足条件,并且第iii行的状态为SSS,可行的方案数。然后状态转移:dp[i+1][nS]=∑nS与pS=0且nS可行dp[i][pS]dp...原创 2018-04-16 23:32:56 · 363 阅读 · 0 评论 -
codeforces gym-101741 Elevator 动态规划、单调队列
题目这里写链接内容题解注意:题目给出是按照时间给出的顺序。我们考虑第iii个人要上的楼高h[i]h[i]h[i],排在第iii个人前面的,所有要人上的楼高度≤h[i]≤h[i]≤h[i]的人都可以被合并在与第iii个人一起被传送上去。所以我们只需要考虑h[i]h[i]h[i]单调递减的序列就可以了,其它的人我们都可以删掉不看,因为它已经被合并了。例如: 一个hhh序列...原创 2018-04-07 22:01:11 · 504 阅读 · 0 评论 -
codeforces gym-101745 D-Stamp Stamp Stamp动态规划
题解一道很不错的动态规划问题,首先这些印章一定是s的子串。 我们可以枚举s的子串然后进行check。 如何check,成了这道题的关键。由于盖章的顺序不知道,所以我们可以使用动态规划的方法。 我们定义状态: dp[i][j]dp[i][j]dp[i][j]表示的是sss串的前iii个被完美盖上,并且Stamp刚好盖到第jjj个,的bool值。这样最终的答案就是dp[len(s)...原创 2018-03-30 10:41:44 · 313 阅读 · 0 评论 -
洛谷 动态规划一日游 P2577、P1070、P2051
记2018年3月19日贼颓呢,一天就写了两道DP,还都不会写,这可GG。 动态规划真的难且有趣,算法题中动态规划占到了很大的比例,而且动态规划往往是辅助解决一些其他类型问题的基础,加深加强对动态规划问题的认识和训练非常有必要。P2577 午餐题意题意见题目链接题解这道题目本质上是一道背包问题,是背包问题的变形,这道题不同的地方在于有两个背包。 因此,...原创 2018-03-19 20:00:44 · 330 阅读 · 0 评论 -
洛谷P1169 树上分组背包
题解第一次写树上分组背包的题目。什么是分组背包?分组背包就是将物品进行分组每组内部只能选择一类物品。for(int i = 1;i <= N;++i){ for(int j = 0;j <= V;++j){ for(int k = 0;k <= item[I];++k){ dp[i][j] = max(dp[...原创 2018-03-18 23:30:28 · 654 阅读 · 0 评论 -
P1081 开车旅行 倍增 洛谷
题目连接题意题目已经说的hin明确了。题解我们要求出从每个点出发,小A要走的城市和小B要走的城市。我们把iii以后的所有点的海拔加入到setsetset,然后拿H[i]H[i]H[i]到set里面去lower_bound,找到比H[i]大的两个地点和比H[i]小的两个地点,并把这四个地点与H[i]的差值加入到新的排序数组中,排个序,找到差值最小的两个点,分别就是小B...原创 2018-03-17 12:18:19 · 505 阅读 · 0 评论 -
闲来无事刷水题、简单博弈论专题、sg函数、洛谷
记今天闲来无事,不想刷codeforces了,到洛谷提高组训练营找几道水题刷着玩玩(虽然自己早已过了打OI的年纪)~简单博弈论专题P1199 三国游戏这么考虑,由于电脑总是不能让我搭配出当前能搭配出的最大的组合,也就是说我不管选哪个英雄,都不可能匹配出该英雄能搭配出的最大的默契值,那么我最大能搭配出的默契值就是所有英雄匹配中,次大默契值的最大值。 假设有a、b、c、da、...原创 2018-03-15 15:35:46 · 692 阅读 · 0 评论 -
codeforces G - Almost Increasing Array 动态规划、动态开点线段树
题意给出一个序列,允许删除一个元素,并将任意元素的值修改为任意整数,问最少修改多少个元素使得序列变成严格单调递增的序列?题解这道题目很具有启发性: 不考虑删除元素,原数列各个数值减去他们下标得到一个新的序列,那么新的序列的最长不减序列就是不需要修改的元素个数len,需要修改的元素个数就是n-len即可。这道题也是这么做的,我们枚举要删除的元素下标为kkk,并且得到以元素k−1...原创 2018-03-14 13:02:37 · 332 阅读 · 0 评论 -
codeforces F.Fibonacci String Subsequences
题意定义F(x)为F(x-1)与F(x-2)的连接(其中F(0) = ‘0’,F(1) = ‘1’)。 给出一个长度不超过100的字符串s,询问s在F(x)的所有子序列中出现了多少次。题解数量很大的计数问题,我们首先想到的解决方案就是dp。 我们考虑F(x) = F(x-1) + F(x-2) 是由两部分构成的,我们可以分治来计算。 s[1,n]在F(x)中出现的次数由...原创 2018-03-08 22:53:19 · 486 阅读 · 0 评论 -
codeforces F.F. Teodor is not a liar! 最长不降子序列
题意给出一堆线段。 询问者每次可以询问一个整数点,回答者告诉询问者这个点被多少根线段包括。 问询问者最多问多少次,还不能确定任意一个整数点都不可能被所有的线段包含。题解首先用O(n)的方法计算出来每个点被多少条线段包含。 突破点: 我们考虑什么情况下不能确定存在整数点被所有线段包括。 反向思考:当存在一个点被所有的线段包括了,那么必定有 cnt(x1)<=cnt(...原创 2018-03-08 11:22:07 · 417 阅读 · 0 评论 -
洛谷P1373 小a和uim之大逃离 动态规划
题解 我们可以先简单的想一种状态,也就是dp[i][j][x][y][t]dp[i][j][x][y][t]dp[i][j][x][y][t],这是最暴力的。 当t = 0时,表示小a处于(i,j)位置,其中小a拥有x魔液,uim拥有y的魔液时候的方案总数。t = 1的时候反过来,意义类似。 这样的话我们很容里列出转移方程(这里就不给出了),但是这样的话内存和时间上都会爆炸80...原创 2018-02-27 20:36:56 · 268 阅读 · 0 评论 -
codeforces 940E Cashback 有趣的dp
题解 这么明显的一个dp,我怎么就没看出来呢?! 首先我们需要一些前提条件:任何划分出来的一个区间的长度不应该超过c。 如果这个区间长度大于c,那么设len=n∗c+klen=n∗c+klen=n*c+k,那么这个区间应该被分成n个长度为c的区间和一个长度为k的区间,因为这样的话去掉的元素数量是相同的,并且区间更小有利于较小的值不易被取到。因为每次去掉的最小值仅仅是局部最小值,...原创 2018-02-24 22:51:12 · 787 阅读 · 0 评论 -
codeforces 935E Fafa and Ancient Mathematics 语法树、动态规划
题解 一道很有意思的题目,同时把动态规划和语法树结合起来,很有新意,思路我是想出来了,但是我的写法较为麻烦,从别人的submission中找了一个写起来简介的代码分享给大家。 看到表达式的形式,我们可以想到使用语法树来解决,题目中限定了+号和-号的使用数目。但是对于一个节点来说,我们并不知道左子树中有多少个+号和-号,也不知道右子树中有多少个+号和-号。所以,就需要使用动态规划了。 ...原创 2018-02-20 15:06:20 · 2312 阅读 · 0 评论 -
codeforces 932E Team Work 高等数学求导、dp
题解 这是一道纯粹的数学求导题目。 首先我们先写出要求的公式。 ans=∑nr=1Crnrkans=∑r=1nCnrrkans = \sum_{r=1}^{n} C_n^{r}r^k 乍一看,雾草好吓人,但是学过高等数学且稍有常识的人(不是我)可以看出,这个可以由某个式子不断乘x并求导得出来。 没错,稍有常识的人又可以看出来了,这个式子就是(1+x)n(1+x)n(...原创 2018-02-19 17:38:13 · 446 阅读 · 0 评论 -
codeforces 932D Tree 倍增法+二分搜索
题面叙述 题目给出两种操作: 操作1是将一个权重为W的点加到树的某个节点下。 操作2是询问一个从R开始的序列的最长可能长度。 其中这个序列要这样找:从R开始,沿着祖先方向往上找,凡是权重大于等于当前序列最后一个点的要被选上,然后更新序列。权重和要最大且小于X。题解 我们设定一个数组nxt[i]表示i的祖先中,第一个权重大于等于i的权重的节点。再定义一个数...原创 2018-02-18 19:39:31 · 376 阅读 · 0 评论 -
codeforces D.MADMAX 动态规划、记忆化搜索
题意 给出一个DAG,每条边上有权重(权重是小写字母的ASCII码),现在两位同学A和B分别位于某两点上(可以相同),其中A和B轮流走,但是每人所走的边权不能变小,走到不能走为止就输。 A先走,询问最后谁会赢。题解 比较明显是一个DP,定义dp[i][j][c]表示轮到i点的人走,另一个人在j点,下一次要走的边的权重必须>=c,i点的人是否能赢。递推方原创 2018-01-30 20:01:04 · 296 阅读 · 0 评论 -
codeforces 831D Two Melodies dp具有启发意义
D. Two Melodiestime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputAlice is a beginner composer and now she is原创 2017-11-05 10:19:57 · 263 阅读 · 0 评论 -
Juice Extractor dp
题意:水果忍者游戏,给出N个水果的出现时间和消失时间。每次切可以清除该时刻中屏幕上的所有水果,只有combo>=3的时候才得分,得分为combo的值。题解:可以把每个水果看成是一段时间区间。然后把这些区间按照出现时间为第一关键字,消失时间为第二关键字排序。我们定义dp方程dp[i]表示最后一刀切掉第i个水果,所获得的最大积分。那么,最优的方案肯定是在第i个水果出现时间进原创 2017-10-09 10:24:53 · 296 阅读 · 0 评论 -
HDU2490 Parade 单调队列优化DP
ParadeTime Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1147 Accepted Submission(s): 529Problem DescriptionPanagola, The Lord o原创 2017-08-24 11:05:53 · 338 阅读 · 0 评论 -
动态规划训练25 [Food Delivery ZOJ - 3469 ]好题
Food Delivery ZOJ - 3469原创 2017-06-27 16:37:28 · 426 阅读 · 0 评论 -
动态规划训练24 [Phalanx HDU - 2859 ]
Phalanx HDU - 2859 这是一道非常好的题目,我实在是没想到该怎么做,看了一下大神的题解才恍然大悟(还有这种操作?)由于对称矩阵是以对称轴进行对称的(废话),所以我们可以用dp[i][j]表示(i,j)所经过的主轴线,并且以(i,j)为左下角的最大的对称矩阵。这样的话,我们再考虑左下方的一个元素(i+1,j-1),如果从这个点出发向上有k个元素与从这个点出发向原创 2017-06-24 22:08:35 · 263 阅读 · 0 评论 -
动态规划训练23 [Making the Grade POJ - 3666 ]
Making the Grade POJ - 3666 这道题目有点意思。我们定义dp[i][j]表示的含义是把包含前i个元素的子序列变成非递减的子序列,并且最后一个元素变成j所需要耗费的最小代价那么状态转移方程可以写出来就是:dp[i][j] = min(dp[i-1][k] + abs(num[i] - j)) 其中 0这个方程很简单对吧,但是问题来了这样的原创 2017-06-24 22:00:26 · 295 阅读 · 0 评论 -
动态规划训练22 [Milking Time POJ - 3616 ]
Milking Time POJ - 3616 说实话这道题目非常简单,本质上就是 多段有向图的求最大值问题。稍微变化的地方在于这个的的有向边没有那么明显 ,而是需要自己去寻找如果任务i到任务j之间存在有向边的话,那么一定有这个关系成立,即:i.endtime + R 对所有满足上面条件的任务之间建立有向边,然后dfs记忆化搜索ok#include #include原创 2017-06-24 21:56:42 · 195 阅读 · 0 评论 -
动态规划训练21 [FatMouse and Cheese HDU - 1078 ]
FatMouse and Cheese HDU - 1078 这道题需要说一说,定义dp[x][y]表示从点(x,y)出发,每次走不超过k步,所能吃到的最大量。有点难搞的是,这里递归的顺序不好确定,所以采用自顶向下的记忆化搜索的方式(不用担心后效性,因为每次走到新的位置的食物量都比当前的食物量要多,因此这样定义子结构不具有后效性)从起点开始搜索就行了#include原创 2017-06-24 21:52:40 · 176 阅读 · 0 评论 -
动态规划训练20 [Treats for the Cows POJ - 3186 ]
Treats for the Cows POJ - 3186 简单的区间DP,就不解释了。#include#includeusing namespace std;const int INF=1e9;const int maxn=2005;int n, a[maxn];int dp[maxn][maxn];int main() { scanf("%d原创 2017-06-24 21:51:52 · 204 阅读 · 0 评论 -
动态规划训练19、最短路 [Help Jimmy POJ - 1661 ]
Help Jimmy POJ - 1661 题意:大致是一个人从某个点开始下落,下落的速度是1m/s,然后在平台上的时候可以左右移动,移动的速度也是1m/s,但是这里有一个限制,就是说每次下落的距离不能超过一个给定的数值。问你从起始点下落到地板最少需要多少s。题解,这道题我看到的时候第一感觉是最短路,建图方法就是对于每一个平台的两个端点(编号为2*i+1和2*i+2),考虑原创 2017-06-24 21:44:34 · 305 阅读 · 0 评论 -
动态规划训练18 [免费馅饼 HDU - 1176 ]
免费馅饼 HDU - 1176 这也是一道比较简单的动态规划dp[i][j]表示到时间i,位置为j所能采集的最大馅饼数量状态转移非常好写dp[i][j] = max{dp[i-1][j],dp[i-1][j-1],dp[i-1][j+1]} + T[j][i]其中T[j][i]表示的是时间为i,位置为j落下的馅饼的数量#include #inc原创 2017-06-23 22:46:19 · 203 阅读 · 0 评论 -
动态规划训练17 [Super Jumping! Jumping! Jumping! HDU - 1087 ]
Super Jumping! Jumping! Jumping! HDU - 1087 过于简单懒得说了#include #include #include using namespace std;const int MAX = 1000;int a[MAX];int dp[MAX];main(){ int N; while(scanf("%d",&原创 2017-06-23 22:42:58 · 177 阅读 · 0 评论