一般动规与递推
文章平均质量分 50
WerKeyTom_FTD
我是一只来自中山纪念中学高三的oier,请多多指教
展开
-
涂色游戏
题目大意n*m的网格图,有p种颜色可以涂,要求给网格图涂色使得任意相邻两列都满足以下条件:两列出现的颜色数至少为q。 求方案数DP设f(i,j)表示目前做了i列,最后一列有j种颜色。转移的话我们可以枚举新的一列有k种颜色,两列共有的颜色数为l,然后方案数为g[n][k]∗Clj∗Ck−lp−jg[n][k]*C_j^l*C_{p-j}^{k-l} 后面的组合数很好理解,在j种颜色选出l种颜色作为原创 2016-11-07 22:38:49 · 1035 阅读 · 0 评论 -
道路规划
题目大意两排点,每个点只跟一条线相连。 选最多的线,使这些线两两相交。水题相交就是i#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(i,a,b) for(i=a;i>=b;i--)using namespace std;const int maxn=100000+10;in原创 2016-10-06 07:42:29 · 708 阅读 · 0 评论 -
tree
题目描述给一棵n 个结点的有根树,结点由1 到n 标号,根结点的标号为1。每个结点上有一个物品,第i 个结点上的物品价值为vi。 你需要从所有结点中选出若干个结点,使得对于任意一个被选中的结点,其到根的路径上所有的点都被选中,并且选中结点的个数不能超过给定的上限lim。在此前提下,你需要最大化选中结点上物品的价值之和。 求这个最大的价值之和。树形依赖首先把树线性化,就原创 2016-10-06 07:55:18 · 536 阅读 · 0 评论 -
[51nod1668]非010串
题目描述如果一个01字符串满足不存在010这样的子串,那么称它为非010串。 求长度为n的非010串的个数。(对1e9+7取模)DP写个DP式,然后矩阵乘法即可 因为比较懒现在懒得去推那个式子是啥了 看代码吧#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;原创 2016-10-29 18:37:40 · 921 阅读 · 0 评论 -
灵知的太阳信仰
题目大意每个位置有两个值ai和bi。 给一个序列分成若干连续段,使得每个段内a值互不相同,代价是b的最大值。求最小代价。DP我们思考设fi表示给1~i分段的最小代价。 我们可以处理出ci表示一个最小的k使得[k,i]没有重复a。 这个随便用个桶就实现了吧。。 那么Fi=mini−1j=ci−1(Fj+max(j+1,i))Fi=min_{j=ci-1}^{i-1}(Fj+max(j+1,i)原创 2016-11-10 16:25:44 · 896 阅读 · 0 评论 -
分组
题目大意给n个数分组,每一组的代价是最大值与最小值的差。 求有多少种分组方案,使得代价和不超过m。DP先想想一个朴素的dp。 将这些数从大到小排序,设Fi,j,k表示做完了第i个数,目前有j个未填入最小值的组,代价和为k。 第一种转移,第i+1个数单独作为一组: *1->Fi+1,j,k 第二种转移,第i+1个数不作为最小值的填入一个组: *j->Fi+1,j,k 第三种转移,新建一个原创 2016-10-31 15:36:24 · 422 阅读 · 0 评论 -
字符串
题目大意求一个只由小写字母组成的长度为n的字符串中,有多少个不包含给定字符串的?DP我们可以考虑KMP 再处理nexti,c表示指针在第i个位置时接收字符c指针会移动到哪 fi,j表示填到第i个位置,目前指针为j 然后就可以转移#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(i=a;i<=原创 2016-11-12 11:25:52 · 419 阅读 · 0 评论 -
[BC#89B]Fxx and game
题目大意给定n、k、t。 对于一个数x,可以一步变成x/k(必须整除)或x-i(1<=i<=t) 求把n变成1的最少步数DP设f[i]表示i变成1的最少步数 显然f[i*k]=min(f[[i*k],f[i]+1) 那么对于减怎么办? 维护单调递增的单调队列,每次从队头取决策,如果队头不合法则踢出。 注意k=1或t=0#include<cstdio>#include<algorithm原创 2016-11-02 14:42:45 · 596 阅读 · 0 评论 -
抗拒黄泉
题目大意一个n*m的网格上,有一些格子可操作。 每一轮等概率选择一个可操作的格子操作,若选择了(i,j),那么第i行与第j行会被标记为操作过。 求期望轮数使得所有行和所有列均操作过。 n,m<=20,n*m<=200容斥我们用P(i)表示已经过了i轮,还没有使得所有行列均操作过的概率。 那么答案即为 ∑∞i=0(P(i)−P(i+1))∗(i+1)\sum_{i=0}^\infty(P(i原创 2016-11-02 20:46:29 · 726 阅读 · 0 评论 -
最近公共祖先
题目描述YJC最近在学习树的有关知识。今天,他遇到了这么一个概念:最近公共祖先。对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。YJC很聪明,他很快就学会了如何求最近公共祖先。他现在想寻找最近公共祖先有什么性质,于是他提出了这样的一个问题:n层的满k叉树T,求对于每一对(i,j)(1≤i,j≤T的点数),LCA(T,i,j)的深度原创 2016-11-14 20:36:24 · 776 阅读 · 0 评论 -
最优得分
题目大意n道题目,在第x分钟做对第i道题得Ai-Bi*x分,第i题一旦开始做就得连续的做Ci分钟。 给你m分钟,每道题目当然只能做一次,求最大得分。偏序关系如果我们已经决定了要做哪些题,如何分配最优顺序? 考虑对已知解得优化,假如做完第j道题后立刻做第k道题,交换这两题的做题顺序有没有可能更优? 不交换没有交换了优?那么 Aj−Bj∗Cj+Ak−Bk∗(Cj+Ck)<Ak−Bk∗Ck+Aj−原创 2016-11-14 21:25:23 · 489 阅读 · 0 评论 -
告别
题目大意一个n的排列,每次可以选择三个不同位置(这三个位置有序,(2,1,3)与(1,2,3)不同),然后对它们进行一次轮换。 只能操作m次,某一次操作过后当前排列变成了目标排列则停止操作。 每次均等概率选择三个有序位置进行操作。 在模意义下求m次操作内变成目标排列的概率。设状态首先可以扭转初始排列和目标排列,使得目标排列变成有序的(就是变成1,2,3……n) 我们知道可以用置换来表示一个排原创 2016-12-06 17:03:07 · 426 阅读 · 0 评论 -
[51nod 1327]棋盘游戏
题目描述有一个N行M列的棋盘,即该棋盘被分为N*M格。现在向棋盘中放棋子,每个格子中最多放一个棋子,也可以一个不放。放完棋子后需要满足如下要求: 1)对于第i行来说,其从左往右的前left[i] 个格子(即最左侧的left[i] 个连续的格子)中恰好一共有1个棋子; 2)对于第i行来说,其从右往左的前right[i]个格子(即最右侧的right[i]个连续的格子)中恰好一共有1个棋子; 3)对原创 2016-12-21 20:38:57 · 767 阅读 · 0 评论 -
[51nod 1361]有一种递推
看大爷的题解吧…… 这里写链接内容转载 2016-12-21 20:40:28 · 709 阅读 · 0 评论 -
完全背包问题
题目大意做法定义有数量限制的叫大件,其余是小件。 考虑最小的那个体积v1。 如果连v1都是大件,DP容易解决。 不然的话,考虑在模v1意义下进行,最终要凑出的S必定是S%v1。 问题在于,凑出S%v1不一定能凑出S。 实际上,如果能凑出x,x+v1也能凑出。 因此考虑求出每个模意义下能凑出的最小数便可以每次判定能否凑出。 不过还有大件限制困扰我们。我们设f[i,j]表示用了i个大件,凑原创 2016-12-23 22:42:09 · 519 阅读 · 0 评论 -
前鬼后鬼的守护
题目大意给定序列x。 将xi修改成x’要付出|x’-xi|的代价。 求最小代价使得xi<=xi+1维护函数设DP,Fi(x)表示把第i个修改成x使得前i个递增的最小代价。 Fi(x)=|x-xi|+min(Fi-1(1~x)) Fi就是函数嘛,容易观察出还是许多一次函数组成的单调函数。 每次就是加上两段一次函数,那个取min是把斜率大于0的直线改为平板。splay维护即可。#include原创 2017-01-14 22:37:40 · 680 阅读 · 0 评论 -
与运算
题目大意对于一个a序列,定义si表示a1~i做and运算。 将a重排来最大化s的总和。DP我们把s一样的记为一块 设Fi表示一个s值为i的块放最前面,最大的总和。 显然我们要把所有与i做and等于i的塞进最前面那块里面,还需要预处理gi表示多少aj and i=i。这个是经典分治。 每次枚举下一块的值j转移,注意i and j=j,所以能塞进第一块的之前被塞进了第二块。 如果我们认为可以有原创 2017-01-15 16:56:45 · 549 阅读 · 0 评论 -
序列
题目大意随机序列a。 a0=0。 ai以pi%为ai-1再加1,否则为0。 求序列和的平方的期望。DP设fi表示1~i的和的平方期望,gi则表示和的期望。 根据(a+b)^2=a^2+b^2+2ab fi=∑i−1j=−1(fj+s2[i−j−1]+2∗gj∗s1[i−j−1])∗(1−pj+1)∗Πi−1k=j+2pkfi=\sum_{j=-1}^{i-1}(fj+s2[i-j-1]+2原创 2017-01-15 17:14:42 · 444 阅读 · 0 评论 -
[bzoj4658]rescue
题目描述wyh8000很喜欢看书,特别是那种很容易死脑细胞的书。 wyh8000看书喜欢从第K页开始看起,然后看到第M页,但是wvh8000并不是有耐心的小盆友,他 只想快点完成看书任务,然后就可以去愉快的农别人了,于是他经常跳着看,但是他一次最多跳D页, 然后阅读那一页的内容,然后死掉A的脑细胞。当然如果那一页的内容他比较感兴趣,又会回复一定 的脑细胞。 好心的学长不希望看到wyh800原创 2017-01-16 10:34:44 · 573 阅读 · 0 评论 -
[bzoj4574][UOJ#196][ZJOI2016]线段树
题目大意一个随机的序列长度为n。 有m次操作,每次随机选择一个区间[l,r],将这个区间所有数变成最大值。 问每个位置在m次操作后的期望。 答案模1e9+7 n<=400,权值随机DP权值随机的条件可以认为权值互不相同 离散化 我们设sum[i][j]表示第i个位置变成第j小的权值的方案数。 我们一个数一个数的做,设当前做的数是第now小,权值为val[now]。 我们设g[k,i,原创 2017-02-24 22:11:24 · 732 阅读 · 0 评论 -
[51nod1634][hdu5729]刚体图
题目大意n*m的网格图。 对于一个网格,你可以什么都不干,也可以加一条对角线(有两种加法,只能加一条) 问有多少稳定网格图模型转化不论怎么改变网格图形状 同一行的竖边一定平行,同一列的横边一定平行。 加对角线会限定一行与一列的所有边都互相垂直。 稳定网格图一定是所有横边与所有竖边都相互垂直。 因此模型可以转化为,求联通二分图的数量。DP设dp[n,m]表示左边n个点右边m个点的联通二分图原创 2017-03-17 15:07:38 · 677 阅读 · 0 评论 -
[bzoj4762]最小集合
题目描述定义一个非空集合是合法的,当且仅当它满足以下两个条件。 1、集合内所有元素and和为0 2、它的非空子集中仅有它本身满足1 给出一个集合S,求它的合法非空子集数。DP先把给定集合所有数取反。 比如有效位数是4位,1101就变成0010。 那么问题变成,所有元素or和为1023,而去掉任意一个元素后or和均不为1023。 那么接下来我们来设一个诡异的状态。 因为要知道去掉一个人元原创 2017-04-07 16:38:38 · 1215 阅读 · 0 评论 -
[bzoj3812]主旋律
题目大意问多少边的子集仍然是强联通的。DP设f[i]表示点集为i有多少边的子集强联通。 考虑补集转化,如果不是强联通,缩点后会形成一个DAG。用总的减去非法。 考虑容斥,枚举出度为0的点的点集j,那么如果包含奇数个强连通分量,则表示至少j个出度为0,容斥系数为负,否则容斥系数为正。 那么,我们可以设g[i]表示点集为i有多少边的子集形成奇数个互相之间没有边的强联通分量 ,h[i]表示点集为i有原创 2017-04-09 09:09:25 · 768 阅读 · 0 评论 -
[bzoj3072]Two Cakes
题目描述有两个长度为n的排列(1<=n<=1,000,000),然后你要再次写出一模一样的两个排列,于是你的左手和右手同时拿笔开始写。但是为了锻炼自己的协调能力,你不想左手和右手同时在写一模一样的数,每写一个数你就需要花1ms的时间,那么你要写完这两个序列至少要花多久时间呢?注:每个序列同时只准用一只手写。DP要注意到这是两个排列。。 最朴素的dp是设dp[i,j] 如果a[i]!=b[j],肯原创 2017-03-15 21:47:12 · 606 阅读 · 0 评论 -
最长路径
题目描述在Byteland 一共有n 个城市,编号依次为1 到n,它们之间计划修建n(n-1)/2条单向道路,对于任意两个不同的点i 和j,在它们之间有且仅有一条单向道路,方向要么是i 到j,要么是j 到i。换句话说,这是一个n 个点的竞赛图。 Byteasar 居住在1 号城市,他希望从1 号城市出发,沿着单向道路不重复地访问一些城市,使得访问的城市数尽可能多。 请写一个程序,帮助Byteas原创 2017-04-18 11:11:02 · 1570 阅读 · 0 评论 -
开房间
题目描述A君与B君正在玩一款闯关游戏,游戏共有n关,每一关的目标只有一个:开房间。 每一关都会有m个房间(从1~m进行编号),A君与B君每关各打开一个房间即可过关,但两人不能打开同一个房间。 通过每一关后,m个房间会重新关上,在第i关打开第j个房间需要消耗t[i][j]的体力值。并且无论A君还是B君,除了第一关外,若上一关自己开了a号房间,这一关开了b号房间,则需要额外消耗K*|a-b|点体力值原创 2017-04-18 11:16:49 · 582 阅读 · 0 评论 -
树
题目描述有n个点,它们从1到n进行标号,第i个点的限制为度数不能超过A[i]. 现在对于每个s (1 <= s <= n),问从这n个点中选出一些点组成大小为s的有标号无根树的方案数。DPprufer序DP裸上#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;t原创 2017-04-18 11:30:41 · 482 阅读 · 0 评论 -
[bzoj2169]连边
题目描述有N个点(编号1到N)组成的无向图,已经为你连了M条边。请你再连K条边,使得所有的点的度数都是偶数。求有多少种连的方法。要求你连的K条边中不能有重边,但和已经连好的边可以重。不允许自环的存在。求连边的方法数。我们只关心它模10007的余数。DP设f[i,j]表示无顺序的连了i条边,有j个度数为奇数的点。 f[i,j]=1i(f[i−1,j−2]∗C2n−j+2+f[i−1,j]∗j∗(n−原创 2017-04-20 17:25:20 · 1046 阅读 · 0 评论 -
[bzoj4861]魔法咒语
题目描述瞎做显然是AC自动机dp。 小的直接dp大的矩阵乘法。#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;typedef long long ll;const int maxn=200+10,mo=1000000007原创 2017-04-20 16:53:04 · 878 阅读 · 0 评论 -
[bzoj4881]线段游戏
题目描述quailty和tangjz正在玩一个关于线段的游戏。在平面上有n条线段,编号依次为1到n。其中第i条线段的两端点坐 标分别为(0,i)和(1,p_i),其中p_1,p_2,…,p_n构成了1到n的一个排列。quailty先手,他可以选择一些互不相交 的线段,将它们拿走,当然他也可以一条线段也不选。然后tangjz必须拿走所有剩下的线段,若有两条线段相交, 那么他就输了,否则他就赢了。原创 2017-05-20 09:02:28 · 879 阅读 · 0 评论 -
[bzoj4832]抵制克苏恩
题目描述小Q同学现在沉迷炉石传说不能自拔。他发现一张名为克苏恩的牌很不公平。如果你不玩炉石传说,不必担心,小Q 同学会告诉你所有相关的细节。炉石传说是这样的一个游戏,每个玩家拥有一个 30 点血量的英雄,并且可以用牌 召唤至多 7 个随从帮助玩家攻击对手,其中每个随从也拥有自己的血量和攻击力。小Q同学有很多次游戏失败都是 因为对手使用了克苏恩这张牌,所以他想找到一些方法来抵御克苏恩。他去求助职原创 2017-05-20 09:08:48 · 674 阅读 · 0 评论 -
[JZOJ5134][SDOI省队集训2017]三元组
题目大意求∑ai=1∑bj=1∑ck=1[(i,j)=1][(i,k)=1][(j,k)=1]\sum_{i=1}^a\sum_{j=1}^b\sum_{k=1}^c[(i,j)=1][(i,k)=1][(j,k)=1]推式子首先假设a<=b<=c。 第一步转化为 ∑ai=1∑bj=1,(j,i)=1∑ck=1,(k,i)=1[(j,k)=1]\sum_{i=1}^a\sum_{j=1,(j,i原创 2017-06-09 21:24:28 · 844 阅读 · 0 评论 -
哈哈
题目大意DP容易发现满足那两个条件就是说不存在低谷。 设g[i,j,0/1]表示[i,j]是最后一次操作的,其中是递增还是递减的最大得分,由于相邻两项差1可以直接得到长度。 设f[i,j]表示操作掉[i,j]的最大得分,有两种转移。 f[i,j]=f[i,k]+f[k+1,j]f[i,j]=f[i,k]+f[k+1,j] f[i,j]=g[i,k,0]+g[k+1,j,1]+v[2∗w[k]原创 2017-07-01 17:07:32 · 348 阅读 · 1 评论 -
呵呵
题目大意n个点,i和j之间有wi*wj条边。 图中任一生成树的贡献记为每个点的度数积。 求所有生成树贡献和。prufer序富榄题解#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(i,a,b) for(i=a;i>=b;i--)using namespace std;type原创 2017-07-01 17:20:50 · 307 阅读 · 0 评论 -
没有上司的舞会
题目大意动态加子节点的树,每次询问最大独立集大小。DP给平衡树每个点x维护一个f[x,0/1,0/1]表示以x为根的这个平衡树区间在原树上对应的部分(包括连出去的虚子树)的最大独立集是多少,且这个平衡树区间的左端和右端选或不选。 然后就很好做了。#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)usin原创 2017-06-22 20:43:26 · 464 阅读 · 0 评论 -
[CF480C]Riding in a Lift
题目描述懒得写DP设f[i,j]表示第j次在i。 转移到的是个区间,用前缀和优化即可。#include<cstdio>#include<algorithm>#include<cmath>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;const int maxn=5000+10,mo=1000000007;int f[max原创 2017-06-11 16:08:50 · 308 阅读 · 0 评论 -
[CF480E]Parking Lot
题目描述http://codeforces.com/contest/480/problem/E做法首先加入所有询问坐标,求出答案。 初始答案很好求,你可以设f[i,j]表示以(i,j)为左下角的最大正方形边长。 那么f[i,j]=min(f[i−1,j],f[i,j+1])(+1)f[i,j]=min(f[i-1,j],f[i,j+1])(+1)后面是否+1要判断右上角。 当然左下角是障碍f[原创 2017-06-11 16:17:31 · 852 阅读 · 0 评论 -
[bzoj4926]皮皮妖的递推,又是一个牛逼题
题目描述YOUSIKI学习了递推,于是他请皮皮妖给他出道题,皮皮妖说: f(1)=1,f(i)=i-f(i-1),求f(n) YOUSIKI看了一眼把它秒切了,于是他要求皮皮妖加大难度,皮皮妖想了想,说: f(1)=1,f(i)=i-f(f(i-1)),求f(n) YOUSIKI看了两眼把它秒切了,于是他要求皮皮妖加大难度,皮皮妖想了想,说: f(1)=1,f(i)=i-f(f(f(i-1原创 2017-06-11 22:32:14 · 1884 阅读 · 2 评论 -
[hihocoder1526]序列的值
题目描述给定一个长度为 n 的序列 a[1..n],定义函数 f(b[1..m]) 的值为在 [0,m-1] 内满足如下条件的 i 的数目:b 中前 i 个数异或起来的值小于 b 中前 i +1个数异或起来的值。对于 a[1..n] 的每个子序列 b[1..m],求f(b[1..m])之和。做法显然只需要对每个位置i求出前面多少子序列异或和比再异或它之后小即可,后面部分乘一个2的次幂。 假如a<b原创 2017-06-26 15:48:20 · 594 阅读 · 0 评论 -
[hihocoder1527]快速乘法
题目描述在写代码时,我们经常要用到类似 x × a 这样的语句( a 是常数)。众所周知,计算机进行乘法运算是非常慢的,所以我们需要用一些加法、减法和左移的组合来实现乘一个常数这个操作。具体来讲, 我们要把 x × a 替换成:(x<<a0)op1(x<<a1)op2(x<<a2)...opn(x<<an)(x<<a0) op1 (x<<a1) op2 (x<<a2) ... opn (x<<an)原创 2017-06-26 15:58:32 · 812 阅读 · 0 评论