----dp----
gigo_64
莫看,莫看,这不是真实的我(七海脸)
溜了溜了
展开
-
csp模拟 企鹅棋【计数dp】
传送门每个点有向左,向右,都可以,三种跳跃属性。问从起点到终点的,经过每个点一次的方案数。我们要求的就是合法的全排列,满足起点是第一个,终点是最后一个,任何一个可以到下一个的数量。我们考虑最后的这个排列,从1开始,对每个数考虑其应该放在哪里。我们发现,任何时刻,这样放出来的连通块,右端点一定是R或B,左端点一定是L或B。因为我们从1~n添加,所以没有添加的数一定比添加了的...原创 2019-11-14 18:44:56 · 174 阅读 · 0 评论 -
NOI模拟 学园祭的乐队【计数】【期望】
传送门每天修一根,如果哪天发现这根是坏的就退出。求期望天数。考场上想到了如果将修改弄成一个序列,退出就是满足i<=pos[i],但却没有想到可以钦定前面的修改顺序来计数,期望就是总贡献除以排列数(n!)。每个1都可能成为退出的地方。对于第k个1,要满足前k-1个1都是i>pos[i],对于第k个1,i<=pos[i],剩下的乱搞就行。所以对于第k个1,这样的排列数...原创 2019-11-09 17:02:19 · 204 阅读 · 0 评论 -
NOI模拟 长寿花【dp】【组合数学】
传送门题意:有n层,每层a[i]个位置,m个颜色。每个位置可以选择一个颜色。要求相邻颜色不相同,相邻两层颜色集合不完全相同。求方案数。发现a[i]最大5000,直接n方预处理。根据套路设表示第i层用了j个颜色的总方案数。枚举第i位是否启用新颜色得到然后再来考虑很多层。设表示前i层中第i层用了j个颜色的总方案数。如果不管相邻限制,然而相邻不能完全相同。那就直接减去就行...原创 2019-11-07 08:55:09 · 172 阅读 · 0 评论 -
[HAOI2018]奇怪的背包【动态规划】【数论】
传送门对于给出来的一个背包重量w,它能表示出来的是w和给定模数gcd的所有倍数。即gcd(mod,w),2*gcd(mod,w),3*gcd(mod,w)……可以从循环节的角度感性理解。所以每一个数读入时,可以先转化成和模数的gcd。然后能表示出所有它倍数的重量。所以我们选出来的背包加上模数的总gcd,应该是w的约数。这样才能表示出它来。(反正模数可以视作一个背包)然而模数...原创 2019-11-04 21:18:17 · 132 阅读 · 0 评论 -
lzy的游戏【思维分析】【背包】
lzy的游戏致敬那个oier。这道题拿到手还以为要复制一遍弄环之类地想的很复杂。其实我们要静下心来观察性质。首先:选的东西的消耗卡数和小于等于n。废话,要不然选个毛。这个理论的反面形式:只要选的小于等于n,那就可以选。我们感性地发现,如果当前不能用,放到最后去,一阵操作后又可以用了。永远存在至少一张的卡数被满足。否则卡数和就大于n了。所以就是个弱智的01背包。重点...原创 2019-10-23 16:33:47 · 156 阅读 · 0 评论 -
【NOIP2017普吉,,普及组】跳房子【二分答案】【单调队列】【dp】
传送门现在看来是非常裸的一道题。同样是只能从给定区间转移。但区间长度不确定。一眼就能看出来的问题单调性,那就二分吧。二分金币,得到区间长度,单调队列优化一些即可。方程应该是秒出的。从前面选最大的加上自己就行。#include<bits/stdc++.h>using namespace std;#define in read()#define int long l...原创 2019-10-23 08:51:52 · 171 阅读 · 0 评论 -
【poj2374】Fence Obstacle Course【dp】【线段树】
传送门首先是个很经典的那什么弹球下坠动规。分左右两种情况讨论即可。重点在于如何处理每个点下落接住它的栅栏。通过线段树从下往上处理求最大值即可。然后乱搞。#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std...原创 2019-10-21 19:16:44 · 131 阅读 · 0 评论 -
【poj2288】Islands and Bridges【状压dp】【方案计数】
传送门数据很小,一看就是状压。然后以为要搞是否有边,所以用邻接矩阵秒一些。因为有三角形权值。所以要记录上一个点和上上个点。然后判断一下是否形成三角形加权值就行。方案计数套路:如果答案更新,直接更新。如果答案相等,就加上。这在最短路计数之类的问题里也是通用的。注意最后答案要除以2 。因为每条路来回走了两次。#include<iostream>#include&...原创 2019-10-21 17:22:14 · 107 阅读 · 0 评论 -
【poj1390】Blocks【区间dp】
传送门一道很nice的题。首先肯定将颜色相同的缩点,因为中间不可能插进去不同的。首先可以很明白的看出是区间动态规划。但是接下来我们发现不太清楚怎么转移,因为中间和两边选的顺序可能不一样。我们考虑最右边这个大联通块有多少个颜色一样的。因为有些可能是别人并过来的。然后策略就分两种。一种是直接把最右边的吃了。另一种是把中间的吃了然后把右边的弄过来整成一块。设f(l,r,k)表示这个区...原创 2019-10-21 12:55:00 · 75 阅读 · 0 评论 -
【NOIP2017】宝藏【状态压缩】【回溯】
传送门一年前觉得这道题简直是看都不可以看的神题。现在想想好像简单的很。找一个最小生成树,边权规则和根节点距离有关。首先肯定有个枚举根节点的操作。然后看一看12的范围状态压缩先。目标是所有点都进入联通块,那直接搜索一下。边数也就72条不到,好像也没啥影响,,怎么乱搞都能过的鸭子。#include<bits/stdc++.h>using namespace ...原创 2019-10-19 22:08:53 · 133 阅读 · 0 评论 -
斜率优化复健
斜率优化。解决一些动态规划的优化问题。可以做到O(n)。当决策点和之前有关,又不知道取哪个的时候,优化方式有很多。单调队列,单调栈,但有时候这些不够用。比如说当方程跟之前的j又和现在的i有关,就会发生变化。因为不同的i会使选择决策不同,所以有时候不能像单调队列一样直接取判断。根据摆渡车,我们发现大概长这样。f(i)=f(j)+i的和j的相乘之类的+i的一坨+j的一坨。我们将已知的j...原创 2019-10-17 21:30:42 · 74 阅读 · 0 评论 -
csplus 20191017 【咕】【二维偏序】【最短路构图】
woj4756补票辣鸡前缀和题目。跟去年普及第二题差不多还简单很多。#include<bits/stdc++.h>using namespace std;#define in read()#define int long longint in{ int cnt=0,f=1;char ch=0; while(!isdigit(ch)){ ch=getchar()...原创 2019-10-17 14:28:40 · 134 阅读 · 0 评论 -
数位dp复健
对于数位dp,有个挺正常的套路。首先一般拆分数字。将数字的每一位拿出来,作为上界。然后设置状态,一般是填到第几位,然后根据题目设置,比如说windy就要看上一位是谁,不要62就看上一位是不是6之类的。然后注意状态不能跟数字到底是谁有关。就是要确保后面可以乱放的情况下设置状态。拆分完后从高位开始处理。一位一位,用limit来看是否能取到9,反之取到对应数位。然后加起来即可。因为记...原创 2019-10-16 19:52:11 · 107 阅读 · 0 评论 -
【BJOI2019】排兵布阵【背包】
传送门BJOI竟然出这么简单的题,,夭寿了。第一眼被吓了一跳。第二眼,哇数据好小,辣鸡背包。对于每个东西将要求数量排序,然后背包即可。#include<bits/stdc++.h>using namespace std;#define in read()int in{ int cnt=0,f=1;char ch=0; while(!isdigit(ch)...原创 2019-10-12 14:34:56 · 97 阅读 · 0 评论 -
【LOJ NOI Round#2 Day1 T3】不等关系【容斥】【dp】
传送门(ldx:You have successfully forgot to add an 'is' function to the last expression.)(gigo:Oh you're right,,,wait a moment.)(updateeeee 2019.10.13)也是挺毒瘤的一道题。。必须记录一下。我们可以将大于号视作分割点。所以相当于做很多个...原创 2019-10-11 22:00:33 · 118 阅读 · 0 评论 -
最大字段和+二维最大矩阵和
这是两道题,不过对于从一维走向二维的思想启发很有帮助,可以借鉴。最大子段和题意:一个数列,从中抽一串连续数,数字和最大。(数据包含负数)输入:输入数字个数n,然后输入一列数。(草率的说明)暴力做法三次方,枚举左右端点然后加起来。用前缀和可以优化成平方,枚举左右端点。但数据范围是1e6 qwqwq我推荐O(n)做法:动态规划(此处约等于贪心)我们设f[i]...原创 2019-01-19 13:58:38 · 206 阅读 · 0 评论 -
【迪杰+dp】bzoj2143飞飞侠
叶子可爱qwq!任意一点花费定金额可以走一定曼哈顿距离,求三个点在其中之一集合最短路。n是150,如果暴力建边,就是n四次方,死亡。所以我们用时间换空间,采取搜索的思想,将可以走x距离看成在某点拥有x能量。每走一格花费1能量。设f[x][y][k]表示到(x,y)这个点,还剩余k能量的最小花费。用搜索的方式四个方向或者原地不动更新,最后取f[x1][y1][0]等更新答案。...原创 2019-07-31 10:26:37 · 100 阅读 · 0 评论 -
【JSOI2018】潜入行动【树形dp好题】
又是一个长长的题面好题qwq我承认我看了题解pwp对树形dp不够熟悉,对题意转化不熟练。题意就是说,对于任何一个点,其父亲或者儿子至少有一个被选中。求恰好选中k个点的方案数。对于这种可能被父亲管辖的dp,我们仍然设状态表示只被儿子管辖的可能。父亲管辖体现在转移中。我们设f[u][k][0/1][0/1]表示u点子树使用k个装置,u是否安放装置,u是否被管辖,u子树全...原创 2019-10-04 16:19:37 · 140 阅读 · 0 评论 -
【JXOI2018】守卫【dp】
如果我能做你的守卫该多好呀咳咳,这道题一看就很恶心。什么最少多少个呀,所有区间答案都要啊,还要异或起来啊。不过这也告诉我们只有dp能很快干掉它。既然说了区间,那我们可以想当然的设f[l][r]。然后第一个性质:r必须放人。要不然谁来看r如果你能想到对于每一个r,从r开始向左计算,你就赢了。枚举l=r-1;l>=1.动态更新当前r能看到的最左边的点p。那这个区间...原创 2019-10-04 17:03:11 · 132 阅读 · 0 评论 -
【CF1110D】Jongmah【dp】
唔ouo好题啊好题。求三相等或三等差最多有多少个。(这个三等差是连续的,246是违法的)其实我们看到样例1就可以隐隐感受到不对劲。因为直接走三相等只有2,但用三个三等差刚好差出3,这是个挺有趣的极端数据。因为一个三相等一次用掉了三个同样数字,而三等差只用一个。前者比后者条件苛刻一些。所以我们也可以发现,三等差是用来弥补三相等除以三不足的情况的。换句话说,三相等只跟自己...原创 2019-10-08 18:44:23 · 178 阅读 · 0 评论 -
【woj4747】最短路
太妙了卧槽首先除了1之外其它n-1个点全都等价。我们假装选定了一个目标点。将它拎出来。剩下还有n-1个点。这些点在原图上会构成一个最短路树。我们通过动态规划来算这个树。我们设f[i][j]表示最后一层用了j个点,当前已经用了i个点的概率。e[i][j]表示期望。我们可以通过枚举下一层用了多少个点来转移这个概率和期望。我们考虑转移条件。首先,下一层任何一个点都得和本层...原创 2019-10-09 16:21:06 · 90 阅读 · 0 评论 -
【TC SRM 540 Div1】ProductQuery(区间dp)(记忆化搜索)(带权并查集)(中国剩余定理)
这神题,,好神第一步我没想通就GG了。题目求%10,根据中国剩余定理,我们可以把它分解为%2和%5,一个对应%2和%5的值唯一对应%10。这样我们就可以将一个询问转成前缀积之比。分成两个子问题处理,然后进行区间处理。使用记忆化搜索加速。搜索边界是区间无询问了,那就什么情况都可以了,快速幂即可。对于一个区间的询问,有两种可能:区间有包含询问为0的,和不包含的。先区间...原创 2019-10-10 07:44:22 · 113 阅读 · 0 评论 -
【dp】分配教室
传送门一道线性dp,,代码+读优 40排qwq上代码+注释#include<bits/stdc++.h>#define in read()using namespace std;int in{ int cnt=0,f=1;char ch=0; while(!isdigit(ch)){ ch=getchar(); if(ch=='-')f=-1; } ...原创 2018-12-30 14:49:12 · 195 阅读 · 0 评论