--------序列形dp
文章平均质量分 53
扩展的灰
扩展的灰(Extended Ash)
展开
-
LOJ 6495~6497「雅礼集训 2018 Day1」
.真是看懂std就秒的三道题,但是看懂就很难啊(感谢superguymj和memset0两个大佬的代码)稍微说一下题解-------------------------------------------------------- 「雅礼集训 2018 Day1」树这道题的正解被superguymj大佬吊打了,原来O(n⋅2n)O(n·2^n)O(n⋅2n)变成了O(n4)O(n^4)...原创 2019-01-04 08:47:08 · 1357 阅读 · 1 评论 -
Jzoj3169 生产汽车
如前面提到,ABC的汽车工厂有N个工人,他们在一个传送带上生产汽车,工人从左到右排列,编号依次为1到N,采用流水线模式,每个人负责自己的一部分工作。生产一台汽车需要从1号工人开始,当1号完成他的工作后,2号就会开始工作,然后是3号,最后当N号工人完成他的工作后,整个汽车生产完毕。工人们一共需要生产M台汽车,而且必须按照从1到M的顺序去生产。对于工人i,他完成自己的工作需要Ti的时间,而对于原创 2018-01-07 21:55:56 · 421 阅读 · 0 评论 -
Jzoj1968 设计铁路
A省有一条东西向的公路经常堵车,为解决这一问题,省政府对此展开了调查。调查后得知,这条公路两侧有很多村落,每个村落里都住着很多个信仰c教的教徒,每周日都会开着自家的车沿公路到B地去“膜拜”他们的教主,这便是堵车的原因。详细调查显示:这里总共有N个村落,并且它们都在B地的东边。编号为i的村落住有ti个信仰c教的教徒,距离B地的距离为ri(单位:公里)。 为解决这一问题,A省政府决原创 2018-01-30 20:06:36 · 213 阅读 · 0 评论 -
Jzoj2682 最长双回文串
顺序和逆序读起来完全一样的串叫做回文串。比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同)。 输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串。PAM模(mu)板题当然也可以manacher+DP,跑的快#include#include#include#define原创 2017-12-07 22:01:39 · 269 阅读 · 0 评论 -
Jzoj3467 最长上升子序列
维护一个序列,使它可以进行下面两种操作:1.在末尾添加一个数字x2.将整个序列变成第x次操作后的样子在每次操作后,输出当前序列的最长上升子序列的长度序列初始时为空嗯,可持久化线段树的裸题额这可是noip提高组难度的题,我们发现所有操作可以变成一棵树(离线做法老套路了)让后每次最多修改数组上的一个值(考虑二分求LIS的过程)最后改回去就好了注意dfs又卡栈(jzo原创 2017-11-25 18:58:07 · 2932 阅读 · 0 评论 -
Jzoj4746 树塔狂想曲
相信大家都在长训班学过树塔问题,题目很简单求最大化一个三角形数塔从上往下走的路径和。走的规则是:(i,j)号点只能走向(i+1,j)或者(i+1,j+1)。如下图是一个数塔,映射到该数塔上行走的规则为:从左上角的点开始,向下走或向右下走直到最底层结束。 1 3 8 2 5 0 1 4 3 8 1 4 2 5 0路径原创 2017-11-23 20:45:17 · 290 阅读 · 2 评论 -
51Nod1022 石子归并V2
题目传送门四边形不等式第一题,口胡一下我们原来的方程式:f[i][j]=sum[i][j]+max(f[i][k]+f[k+1][j]){i那么,如果我们将最优的那个k记录下来,记为g[i][j],那么必然会有g[i][j-1]当然这个东西成立是需要条件的,就是f[i][j']+f[i'][j]f[i][j]+f[i'][j'] (i博主太弱上面两个都不会证明(只会证明sum[原创 2017-12-02 16:37:42 · 244 阅读 · 0 评论 -
Jzoj5235 好的排列
对于一个1->n的排列 ,定义A中的一个位置i是好的,当且仅当Ai-1>Ai 或者Ai+1>Ai。对于一个排列A,假如有不少于k个位置是好的,那么称A是一个好的排列。现在有q个询问,每个询问给定n,k,问有多少排列是好的。答案对10^9+7取模。显然是计数类dp,我们设f[i][j]表示对于一个1->i的排列,好的位置有j个的情况考虑转移,显然f[i][j]->f[i+1][k]相原创 2017-11-16 17:02:14 · 513 阅读 · 0 评论 -
Jzoj5237 最长公共子序列
给你序列A和B,求出他们LCS的方案数,|A|,|B|dp套dp经典题目,我们考虑先求出LCS,令f[i][j]表示处理到序列A的第i位,B序列的第j位时的LCS长度那么转移很显然,现在考虑如何统计答案我们设g[i][j]为当处理到序列A的第i位,B序列的第j位时LCS的方案数显然我们要考虑f[i][j]的转移情况若f[i][j]=f[i-1][j-1]+1 那么g[i][j]原创 2017-11-17 20:58:39 · 280 阅读 · 0 评论 -
Jzoj5453【NOIP2017提高A组冲刺11.5】好路线
nodgd在旅游。现在,nodgd要从城市的西北角走到东南角去。这个城市的道路并不平坦,nodgd希望找出一条相对比较好走的路。nodgd事先已经得到了这个城市的地图。地图上这个城市是一个n×m的矩形,nodgd现在站在坐标为(1,1)的位置,需要到达坐标为(n,m)的位置。这张地图上用非负整数标记了每个整数坐标点的海拔,坐标为(x,y)的位置的海拔是h(x,y)。nodgd希望找出一条路线,原创 2017-11-06 07:30:47 · 352 阅读 · 0 评论 -
Jzoj4210 我才不是萝莉控呢
小Y:“小R你是萝莉控吗。”小R:“...” 为了避免这个尴尬的话题,小R决定给小Y做一道题。有一个长度为n的正整数数组A,满足艾> =艾+ 1,现在构造一个数组B,令的Bi = ΣA[j] (j∈[i,n])。现在,有一个N * N的网格图,左下角坐标是(1,1),右上角坐标是(N,N)。有一个小SB正在坐标为(n,1)的位置,每一时刻,如果他现在在(x,y),他可以选择走到(x?-原创 2018-01-18 19:52:40 · 1659 阅读 · 0 评论 -
Jzoj2309 辽哥游戏
张辽是一个长发飘飘的非常聪明的男孩,人人都称他为“辽哥”。辽哥喜欢玩一个有趣的电脑游戏。这个游戏开始的时候有n个碉堡,每个碉堡拥有一个防御值a和一个附加值b。玩家拥有一个初始的攻击力S。如果玩家破坏了一个碉堡,则他能得到1分。每一次,辽哥会选择一个碉堡进行攻击。所有未被破坏的碉堡会联合起来防御,因此为了破坏那个碉堡,辽哥的攻击力必须大于或者等于所有未被破坏的碉堡的防御值之和,否则辽哥就会输掉游戏。原创 2018-01-20 21:09:00 · 386 阅读 · 0 评论 -
FWT模板
.稍微学了一下FWT发现挺好写这个东西和FFT其实区别比较大,所以比较适合理性理解比如对于or运算的FWT,我们考虑这样一个式子FWTor(A)[i]=∑j∣i=iA[j]FWT_{or}(A)[i]=\sum_{j|i=i}A[j]FWTor(A)[i]=j∣i=i∑A[j]以及我们要求的东西(A∣B)[k]=∑i∣j=kA[i]∗B[j](A|B)[k]=\sum_{i|j=k}...原创 2018-10-10 10:50:50 · 352 阅读 · 0 评论 -
CDQ分治&整体二分九连测
整体二分好难a CDQ分治&整体二分九连: A[适者] 先来一个不是cdq分治的题(虽然也可以用分治做) 首先先来考虑按照什么顺序来搞掉这些机甲 对于两个相邻的机甲i,j,先i后j的代价是Ai∗Di+(Di+Dj)∗AjAi∗Di+(Di+Dj)∗AjA_i*D_i+(D_i+D_j)*A_j 那么如果i应该比j先消灭就有 Ai∗Di+(Di+Dj)∗Aj<A...原创 2018-08-19 21:32:06 · 571 阅读 · 0 评论 -
51Nod1306 高楼和棋子
题目看这里 一个非常好的逆向思维题(都是套路233) 如果直接做发现其实可以做,但是数据范围太大不能过了,具体做法参考这里 开始正文: 首先,我们设f[i,j]表示f[i,j]表示f[i,j]表示在有i个棋子的情况下,扔j次能保证测出的楼层最高是多少,显然如果n可以被测出,那么n-1也可以被测出 于是考虑一下最优策略是什么 在高度h扔一个棋子下去,如果碎了,那么说明高度&...原创 2018-07-29 11:29:52 · 274 阅读 · 0 评论 -
51Nod1158 全是1的最大子矩阵
题目看这里想到了NOIP普及组当年那道题做法非常显然,O(n^2)枚举矩形的上下边界,让后用一个dp+前缀和就搞定了f[i]表示以第j列作为结尾的最大子矩形的宽,那么如果第i列在[l,r]的范围都是1,那么f[i]=f[i+1],否则f[i]=0答案就是max{(r-l+1)*f[i]}#pragma GCC opitmize("O3")#pragma G++ opitm原创 2018-04-27 17:19:44 · 280 阅读 · 0 评论 -
51Nod1084 矩阵取数问题 V2
题目看这里一个经典的dp题,典型的错误思想就是做两遍我们考虑直接做,f[i][j][x][y]表示第一次取道i,j这个位置,第二次到了x,y这个位置考虑这个i,j和x,y分别是从哪里转移过来,就可以得到方程f[i][j][x][y]=max(f[i-1][j][x-1][y],f[i][j-1][x-1][y],f[i-1][j][x][y-1],f[i][j-1][x][y-1]原创 2018-04-27 17:03:02 · 311 阅读 · 0 评论 -
51Nod1294 修改数组
题目看这里一个非常好的结论题发现题目要求要严格递增而且要求要正整数,所以直接做LIS不行我们令原序列s变为s[i]-i那么如果s[i]-i是一个负数,肯定不符合题意答案加一去掉所有负数以后,就可以对s做一个LIS了,这里LIS可以是严格非降的就可以了#include#include#include#define inf 0x7f7f7f7fusing names原创 2018-04-27 16:16:29 · 248 阅读 · 0 评论 -
51nod1122 机器人走方格V4
题目看这里看一看知道可以dp设f[i][s1][s2][s3][s4]表示走了i步,每个机器人分别在哪个格子里用矩阵优化但是发现状态数过于巨大,会TLE考虑设f[i][j][k]表示走了i步,从j格子走到k格子的方案数那么显然f[i]=T^i 其中T是全1矩阵减掉单位矩阵那么可以快速幂求出f接下来枚举4的全排列g,表示第i个机器人走到g[i]答案就是∑∏f[i]原创 2018-04-27 11:49:53 · 254 阅读 · 0 评论 -
Jzoj5644 凫趋雀跃
经典套路容斥题直接dp做是O(TxTyRk)的可以60分满分做法又要用到经典的容斥法我们设f[i][x][y]表示走i步,走到x,y的方案(不考虑不合法向量)设g[i][x]表示走了i步不合法的向量,走到了(x,x)的方案数二项式反演得Answer=∑(-1)^i*C(R,i)*g[i][x]*f[R-i][Tx-x][Ty-x] 考虑f如何计算,因为x,y两维是独立的原创 2018-04-20 21:06:31 · 284 阅读 · 1 评论 -
Jzoj5600 Arg
给出一个长度为 m 的序列 A, 请你求出有多少种 1...n 的排列, 满足 A 是它的一个 LIS.dp套dp好题!我们先要考虑怎么搞一个状态出来考虑做lis的两种方法:1.设f[i]表示做到i的最长子序列长度2.设f[i]表示长度为i的上升子序列最后那个数最小是多少第一种方式不好设状态,我们考虑第二种显然,如果知道f里有哪些数字,就可以还原f那么我们设一个状态原创 2018-04-17 22:06:19 · 200 阅读 · 0 评论 -
Jzoj4738 神在夏至祭降下了神谕(GOSICK系列)
我们先写裸的dp,设φ[i]表示长度为i的划分方案数,φ(0)=1有φ(i)=Σφ(j) (|sum[j,i]|sum用前缀和预处理就好(将0视为-1)那么我们考虑用树状数组快速更新,我们发现,若s[j](前缀和)在[s[i]-k,s[i]+k]中就可以合法转移所以我们考虑将φ[i]的值插入到s[i]的位置上,每次更新即可注意s[i]可能为负数,要开两倍长度#include原创 2017-10-23 07:15:01 · 618 阅读 · 0 评论 -
Jzoj4595 String
有两种字符串S,T。长度分别为n,m。现在需要在S里面有序地选出k个子串,且在T中出现的顺序与这k个子串的顺序相同。问这k个子串最大长度之和,n,m这个题目一看范围显然就是dp了,我们设f[i][j][k][0]表示S匹配到第i位,T匹配到第就j位,已经选择了k个子串,0代表第k个已经结束,1代表还没结束的最大长度之和那么显然有:f[i][j][k][0]=max(f[i][j-1][原创 2017-10-07 21:31:59 · 366 阅读 · 0 评论 -
Jzoj3894 改造二叉树
#pragma GCC optimize("O3")#pragma G++ optimize("O3")#include<stdio.h>#include<string.h>#include<algorithm>#define INF 0x7f7f7f7fusing namespace std;int l[100010],r[100010],f[100010];int s[100010],w[100010],n,t=0;void mdfs(int x){ if(x){ mdfs(l[原创 2017-10-03 17:20:15 · 311 阅读 · 0 评论 -
Jzoj3805 小X的二叉堆计数
题意:给你n个不同的数问你能构成多少个不同的二叉堆显然不能枚举,我们考虑用递推我们令f[i]表示以i为根的二叉堆有多少种令l,r为i的左右儿子,令size[i]为以i为根的堆的大小那么显然,f[i]=f[l]*f[r]*C(size[i]-1,size[l]),因为n个数互不相同,所以没有重复相当于是1~size[i]这几个数填进这个堆中,那么显然根只能填最大那个,让后在剩下的原创 2017-10-02 11:26:29 · 807 阅读 · 0 评论 -
Jzoj3443 压缩
看到数据范围我们发现可以用dp,设f[i][j]表示目前在第i位,最后一个循环串的长度为j的情况下,最短的长度那么显然,无论怎么样,有一种转移总是成立的,f[i][j]=min(f[i-j][k]+j+1),这相当于新开了一个循环节而另一个转移需要满足一个条件,f[i][j]=min(f[i-j][j]+1),当s(i-j+1,i)=s(i-j*2+1,i-j)时,这相当于在循环节里面加入一个*那么综合下来转移就是n^3的,我们加上两个优化1.令g[i]为min(f[i][k]),避免每次枚举k2原创 2017-09-25 19:39:21 · 275 阅读 · 0 评论 -
Jzoj3497 隐藏指令
显然,我们在计算方案时,每次必然加入在同一维度的,方向相反的行动那么我们令f[i][j][k]表示目前在处理第i维,已经走了2*j步,其中有2*k步在第i维上那么显然,f[i+1][j][0]+=f[i][j][k] 这等于是停止当前这一维的处理,开始下一维原创 2017-09-25 21:57:22 · 317 阅读 · 0 评论 -
Jzoj2934 字符串函数
首先显然不能每个串暴力,我们考虑单独计算每一个字符的贡献对于b[i],若我们找到a[j]=b[i],可以分两种情况讨论1.i所以贡献就是i*j2.i>j 情况是对称的,所以贡献是(n-i+1)*(n-j+1)所以对于原创 2017-09-20 21:48:34 · 388 阅读 · 0 评论 -
Jzoj1322硬币
动态规划,设f[i][j]为上一次取到第i个硬币,上一次取了j个硬币的最大答案,则f[i][j]=max(SUM[i]-f[i-k][k]),对于f[i][j],可以沿原创 2017-09-20 19:12:58 · 349 阅读 · 0 评论 -
Jzoj1310 生日礼物
先模拟,这个是双向链表的工作,让后将移动过后的序列取出来,在序列上面作LIS,那么答案就是n-LIS为什么?很简单LIS上的数不用动其他的都一次移动搞定就好了原创 2017-09-19 22:02:39 · 545 阅读 · 0 评论 -
Jzoj4721 LCS
给你2个没有重复元素的序列A,B,求LCS我们将映射A[i]->i用在B上,对B求LIS即可,若A中没有B[i]直接跳过#include#include#include#includeusing namespace std;mapint,int> s;int f[300010];int main(){ int n,m; scanf("%d%d",&n,&m); for原创 2017-10-15 16:37:06 · 281 阅读 · 0 评论 -
Jzoj5424 凤凰院凶真
给你两个序列A和B,求出他们的最长公共上升子序列并输出方案动态规划,我们假设f[i][j]表示A处理到第i位,B处理到第j位时的长度那么显然,若A[i]=B[j],那么f[i][j]=max{f[i-1][k]}+1,否则f[i][j]=f[i-1][j]我们再记一个g[i][j]表示f[i][j]是从哪里转移过来的,记上面那个k即可到时候直接倒序递归按照g[i][j]输出,若g[原创 2017-11-07 19:22:03 · 396 阅读 · 0 评论 -
Jzoj5451【NOIP2017提高A组冲刺11.4】Genocide(待补充)
给你一个序列a,要你求出一个同样长的序列c满足ai∈{0,1}的情况下使得下面式子值最大 现在还有m个询问,每次修改一个ai(注意询问是互相独立的),依然是问你最大值这个题先讲讲50分,后面要加上cdq完全不会,挖个坑待填额一眼还以为是个线性代数题结果是一个dp差不多就是说,你选一段连续的区间[l,r]会带来(r-l原创 2017-11-04 21:50:07 · 297 阅读 · 0 评论 -
Jzoj5450【NOIP2017提高A组冲刺11.4】Neutral
你获得了无限个狗剩,为此你需要一个无限长的数组来存储狗剩,这个数组要满足以下条件1. 数组仅包含1, 2, 3, ..., n2. 如果n 3. 如果i 数组还在生成中,反正现在很无聊,不如计算有多少种满足条件的数组?答案对1e9 + 7 取模看起来十分恐怖"无限长?!!"发现长度n后面没卵用嗯,让后还有一个限制?对,i~i+a[i]数字要求相同额,果断倒过原创 2017-11-04 21:41:01 · 304 阅读 · 0 评论 -
Jzoj5446 高考是不可能高考的
Snuke 喜欢旗子.Snuke 正在将N 个旗子摆在一条线上.第i 个旗子可以被放在位置xi 或yi 上.Snuke 认为两个旗子间的最小距离越大越好. 请你求出最大值.今天这都是些集训队作业啊!这个题本来以为一眼能做结果死磕磕不动二分答案肯定是要的,问题是怎么判定解1.dp肯定不行了2.数据结构,也不行3.图的最大独立集,比较靠谱但是。。。复杂度原创 2017-11-03 21:03:56 · 403 阅读 · 0 评论 -
Jzoj4891 摆书
十分套路,一看应该就是LIS相关的题目了我们发现,操作只能将数字放在数列头,所以考虑一本书i,若有j使得js[i],那i肯定要被抽出来所以,答案应该是结尾为n的LIS长度,这个就搞一个rank数组就好了;找到最小的k使得对于i>=k都满足rank[i]>rank[i-1],那么k-1就是答案#include#include#include#define N 100010原创 2017-11-02 21:37:14 · 310 阅读 · 0 评论 -
Jzoj4876 基因突变(红警系列)
邪恶的707刚刚从白垩纪穿越回来,心中产生了一个念头:我要统治人类! 但是统治人类是很庞大且复杂的一个工程,707尝试了洗脑,催眠,以及武装镇压都没能成功地统治人类,于是她决定从科学上对人类的基因进行研究从而达到他的目的。 707获取了人类的基因信息并尝试对基因进行实验。他发现可以把人类的基因看做一个只包含小写字母的字符串,并定义从头开始任意长度的基因为“源头基因”人类身上与源原创 2017-10-31 08:10:28 · 1330 阅读 · 0 评论 -
Jzoj4889 最长公共回文子序列
YJC最近在学习字符串的有关知识。今天,他遇到了这么一个概念:最长公共回文子序列。一个序列S,如果S是回文的且分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共回文子序列。YJC很聪明,他很快就学会了如何求最长公共回文子序列。他现在想把问题规模扩大一些,于是他提出了这么一个问题:给一个长度为n(1≤n≤100000)的字符串a和一个长度为m(1≤m≤2原创 2017-11-01 21:59:42 · 540 阅读 · 0 评论 -
Jzoj5429 排列
有两个长度为n的排列A和B,定义排列的价值f(A,B)为所有满足A[i]>B[i]的位置i的数量。现给出n,A,B和S,其中A和B中有一些位置的数未知,问有多少种可能的填数的方案使得f(A,B)=S保证不存在一个位置i满足A[i]=0且B[i]=0十分有趣的题目,是个神奇的组合数学+dp我们先将问题拆成两个,因为题目保证没有A[i]=B[i]=0的位置我们将所有A[i]=0原创 2017-11-08 20:29:34 · 376 阅读 · 0 评论 -
Jzoj4877 力场护盾(红警系列)
ZMiG成功粉碎了707的基因突变计划,为了人类的安全,他决定向707的科学实验室发起进攻!707并没有想到有人敢攻击她的实验室,一时间不知所措,决定牺牲电力来换取自己实验室的平安。 在实验室周围瞬间产生了一个无限大的力场护盾,它看上去无懈可击!不过ZMiG拥有惊人的双向观察能力,经过他的反复观察,找到了这个护盾的N个弱点,他本想逐一击破,却发现一股神秘力量阻止了他的行为。原来他身处力场原创 2017-10-31 16:28:49 · 1035 阅读 · 0 评论