一般动规与递推
文章平均质量分 50
WerKeyTom_FTD
我是一只来自中山纪念中学高三的oier,请多多指教
展开
-
囚人的旋律
题目大意及模型转换给定一个N的排列,第i个数为a[i]。选择一些数组成集合,需要满足以下条件。 1、对于集合内i<ji \lt j,a[i]<a[j]a[i] \lt a[j] 2、对于集合内i<ji \lt j,集合外i<k<ji \lt k \lt j,满足a[i]>a[k]或a[k]>a[j] 求满足条件的集合个数,两个集合包含相同元素视为相同。N<=1000。答案模P=10000000原创 2015-08-12 21:30:03 · 774 阅读 · 0 评论 -
君と彼女の恋
题目大意及模型转换:找出有多少个集合满足以下要求: 1、所有数模M两两不同 2、所有数之和为N N<=10^18,M<=100。结果很大,要求模一个大质数。 集合包含同样的数,而顺序不同视为不同集合。小思路:为了满足约束1,可以先选出一些余数(0~M-1),然后不断给其中的余数加M(这样显然这个数模M不会改变),直至达到N。也就是说,题目转换为选一些余数,使余数之和与N对模M同余,并统计将这原创 2015-08-12 19:30:38 · 1572 阅读 · 0 评论 -
踢足球
题目大意及模型转换:有两个队伍踢足球,每队N人从1~N。一开始0队1号发球。进一球得一分。结束条件是比赛M秒过后,或某一个队得到Q分后。每一秒控球的i队j号队员都有可能发生以下情况。1、传球给对应集合的己方球员。2、被对应集合的敌方球员截球。3、射门。射门之后球交给敌方1号球员。每个人射门都有一定几率中。输出每种比分的概率。分析:设f[i,j,k,l]表示i队开球j时刻的时原创 2015-08-11 20:44:06 · 704 阅读 · 0 评论 -
火星菌
题目大意及模型转换:现在有这样一种填数约束,在区间l..r中填a..b的数,每个数只能填一次。那么需要满足:设mid=(l+r)/2,mid2=(a+b)/2。那么1、在区间l..mid中填a..mid2,在区间mid+1..r中填mid2+1..b。2、在区间l..mid中填mid2+1..b,在区间mid+1..r中填a..mid2。现在,要求你在区间1..2^K中填1..2^K,且若在相邻两原创 2015-08-11 16:31:13 · 884 阅读 · 0 评论 -
登山
题目大意在一个网格图中,不能跨越y=x这条直线,只能向右或向上走,问从(0,0)走到(n,n)不经过m个关键点中任意一个的方案数,答案模10^9+7。任意两点间方案我们先解决从(i,j)走到(k,l)不跨越y=x,方案是多少。 不跨越y=x,就是不经过y=x+1。 我们知道(i,j)到(k,l)的所有方案为Ck−ik−i+l−jC_{k-i+l-j}^{k-i} 意思是一共要走k-i+l-j步原创 2015-10-06 16:12:54 · 648 阅读 · 0 评论 -
B
题目大意及模型转换一个长度为N的字符串,对每个位置放’a’~’z’中的一个字符,在第i个位置放第j个小写字符需要w[i,j]的代价。求一个符合条件的字符串使其价值最大。需要符合条件为使生成字符串的后缀数组为数组A。N<=10^5。DP我们可以考虑一个水DP,设f[i,j]表示做到排名为i的后缀(即后缀sa[i]),在这个后缀的第一个位置放第j个小写字符能获得的最大价值。那么显然可由f[i-1,k]推原创 2015-09-19 13:44:25 · 488 阅读 · 0 评论 -
C
题目大意及模型转换平面上有N个点,每个点选择上、下、左、右其中一个方向射出一条射线。求有多少种方案,使得没有射线穿过其余点且任意两条射线不相交。 N<=54。DP我们考虑将横坐标相同的所有点当作一层。 然后现在从左到右扫。 对于一个点,如果它想要向左射,显然当前所有处理过的点中,向上射的点的纵坐标的最小值要大于当前点的纵坐标,向下射的点的纵坐标的最大值要小于当前点的纵坐标。因此DP状态要保留这原创 2015-09-19 16:19:54 · 560 阅读 · 0 评论 -
排列
题目描述一个关于n个元素的排列是指一个从{1, 2, …, n}到{1, 2, …, n}的一一映射的函数。这个排列p的秩是指最小的k,使得对于所有的i = 1, 2, …, n,都有p(p(…p(i)…)) = i(其中,p一共出现了k次)。例如,对于一个三个元素的排列p(1) = 3, p(2) = 2, p(3) = 1,它的秩是2,因为p(p(1)) = 1, p(p(2)) = 2, p(原创 2016-01-02 15:38:07 · 450 阅读 · 0 评论 -
[bzoj1875][SDOI2009]HH去散步
题目描述HH有个一成不变的习惯,喜欢饭后百步走。所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离。 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回。 又因为HH是个喜欢变化的人,所以他每天走过的路径都不完全一样,他想知道他究竟有多 少种散步的方法。 现在给你学校的地图(假设每条路的长度都是一样的都是1),问长度为t,从给定地 点A走到给定地点B共有多少条符合条件的路径矩原创 2016-03-19 13:22:16 · 623 阅读 · 0 评论 -
[bzoj4332][JSOI2012]分零食
题目大意把正整数M分解成至多N份且每份不为0(注意1+2+3与2+3+1是不一样的即存在顺序性),一份x的价值是f(x)=a2*x*x+a1*x+a0,总价值为每一份价值的乘积。求所有情况下总价值的和,答案模mo。 M<=10000,mo<=255,N<=10^8,a2<=4,a1<=300,a0<=100DP设g[i,j]表示把j分解成i份的总价值和。 显然g[i,j]=∑j−1k=1g[i−原创 2016-01-02 15:16:58 · 1521 阅读 · 3 评论 -
[bzoj3992][SDOI2015]序列统计
题目描述小C有一个集合S,里面的元素都是小于M的非负整数。他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S。 小C用这个生成器生成了许多这样的数列。但是小C有一个问题需要你的帮助:给定整数x,求所有可以生成出的,且满足数列中所有数的乘积mod M的值等于x的不同的数列的有多少个。小C认为,两个数列{Ai}和{Bi}不同,当且仅当至少存在一个整数i,满足Ai≠Bi原创 2015-12-29 18:51:50 · 1195 阅读 · 0 评论 -
[bzoj3456]城市规划
题目大意给你n个点(存在顺序性),初始无边,你可以任意加边。求满足以下条件的连通图数量:无重边无自环。答案模479∗221+1479 * 2 ^{21} + 1DP我们设f[i]表示i个点对应的答案。 正难则反,我们可以用总数量减去不合法数量。 总数量为2C2i2^{C_i^2} 如何不重复不遗漏统计不合法数量? 我们可以枚举i点所在连通块的数量,然后其他乱连, 也就是f[i原创 2015-12-23 20:31:28 · 1534 阅读 · 0 评论 -
WTF交换
模拟题意真麻烦不说了。 用DP模拟题意yy一下加优化就好了,详见代码。#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=3000+10,inf=10000000原创 2016-03-09 19:18:19 · 638 阅读 · 0 评论 -
有趣的有趣的家庭菜园
题目描述职业经营家庭菜园的JOI君每年在自家的田地中种植一种叫做IOI草的植物。IOI草的种子在冬天被播下,春天会发芽并生长至一个固定的高度。到了秋天,一些IOI草会结出美丽的果实,并被收获,其他的IOI草则会在冬天枯萎。 JOI君的田地沿东西方向被划分为N个区域,从西侧开始的第i个区域中种植着IOI草i。在第i个区域种植的IOI草,在春天的时候高度会生长至Hi,此后便不再生长。如果IOI草i会结原创 2016-04-06 19:13:20 · 1529 阅读 · 0 评论 -
[JSOI2016]无界单词
题目大意一个只由a和b组成的长度为n的字符串,如果kmp后next[n]=0,则称之为无界单词。给定n和m,求长度为n的无界单词个数以及第m小的。第一问正难则反! 设f[i]表示长度为i的无界单词数量。 那其实只需要算出有界单词数量,再从总数里减去即可。 枚举j为最小的使字符串前j个与后j个相等。 一个其实并不太显然的性质: j一定小于等于i/2。 为什么呢? 嘿嘿自己想想吧(是我懒得原创 2016-04-25 19:05:14 · 1245 阅读 · 0 评论 -
暴走的图灵机
题目描述做法m代表T串的长度。 一个显然的做法是设g[i]表示i次操作后左手串所包含T串的个数。 则g[i]=g[i-2]+g[i-1]+c 其中c表示跨越中间线(即隔开i-2和i-1次操作后左手串的那条线)的所有串中T串的数量。 设f[i]表示i次操作后左手串的长度。 仔细观察发现,当f[i-2]和f[i-1]都不小于m后,c的循环节为2。 然后先暴力找到最早的id满足f[id]比2m原创 2016-04-11 14:03:44 · 616 阅读 · 0 评论 -
[bzoj4553][TJOI&HEOI2016]序列
题目大意有一个长度为n的序列,有一些位置的值有可能变化。 一次变化最多只会改变一个位置上的值,题目告诉了你可能发生的变化情况。 求在任意可能情况下都能满足非降的最长子序列长度。DP先弄出偏序关系,设mi[i]表示位置i可能出现的最小值,mx[i]就是最大值。 那么对于j<ij<i,j与i可以在一个合法子序列中的条件是: 1、a[j]<=mi[i] 2、mx[j]<=a[i] 设f[i]表原创 2016-05-11 19:36:08 · 1610 阅读 · 3 评论 -
装饰大楼
题目大意现在有一个n的排列。 设f[i]表示以i为结尾的最长上升子序列。 给定你f数组的其中n-1项(你不知道缺的是第几项),求原本的f数组有多少种可能性。仔细想想首先,我们要清楚什么样的f数组能够对应出一个n的排列。 根据DP,很容易知道对于任意的j线性算法首先判无解, 如果出现两处差1那么无解比如: 1 3 5 如果出现一处差2及以上那么无解比如: 1 4 那么有解的情况就是:原创 2016-04-18 12:46:49 · 879 阅读 · 0 评论 -
备用钥匙
题目描述你知道Just Odd Inventions社吗?这个公司的业务是“只不过是奇妙的发明(Just Odd Inventions)”。这里简称为JOI社。 JOI社有N名员工,编号从1到N。所有员工的工作时间从时刻0持续到时刻M,时刻0和时刻M的时候,所有员工都必须在公司内。 某天,出于巧合,JOI社的每个员工都要出行恰好一次。员工i(1<=i<=N)在时刻Si离开公司,时刻Ti回到公司。原创 2016-04-18 14:03:51 · 709 阅读 · 0 评论 -
习用之语
题目大意给出若干个四个字符组成的字符串。 求有多少对仅有m位不同。DP设f[i]表示恰有i位不同的对数。 只有i位不同,意味着如果无视其中的i位,总有一种方案使得两个字符串完全一致。 于是暴力枚举无视哪i位,然后将无视后的字符集排序统计相同对数和记为t。 注意其中可能包括恰有j位不同的对(j<ij<i)所以要减掉。 也就是f[i]=t−∑i−1j=0Ci−j4−jf[i]=t-\sum_{原创 2016-04-18 18:02:38 · 586 阅读 · 0 评论 -
粉刷匠&集体照
题目大意有m个种类的球,第i个种类有r[i]个球,把球排成一行是使得相邻两个球种类不同,问方案数。DP我们可以一个种类一个种类的放球。 两个球中间以及最前最后都有“空”。 定义非法空指该空两端是同色球,合法空反之。 设f[i,j]表示当前做到种类i,有j个合法空。此时有个sum表示空的总数。 我们可以枚举这r[i]个球放去k个合法空中与l个非法空中,那么 f[i,r[i]+j−k−l∗2]原创 2016-05-28 14:43:27 · 657 阅读 · 0 评论 -
[bzoj4524][CQOI2016]伪光滑数
题目描述做法先把质数都筛进数组p。 我们设f[i,j]表示分解后最大质数为p[i],分解的结果是j项的数的集合。 为了顺利的推出f[i,j]我们还要设g[i,j]表示f的前缀和。 先让我们重定义一些符号: 1、a+b返回集合a与集合b的并(a与b均为集合) 2、a*b表示集合a内所有数乘上b(a为集合,b为一个数) 那么转移是这样的: f[i,j]=∑jk=1g[i−1,j−k]∗p[原创 2016-04-20 19:15:44 · 1170 阅读 · 0 评论 -
基因合成
题目描述回文自动机首先,我们可以认为,每个最终串都是进行若干操作后进行了一次第二个操作后,再在两端插入而得到的。 先对最终串插入回文自动机上,然后做动态规划。 我们设f[i]表示i这个结点所代表的回文串最后一次操作是第二个操作需要多少个操作得到。 注意偶数树的根节点f值为1。 fa[i]表示其在回文树上的父亲,pre[i]表示其最长长度不超过其的长度的一半的回文后缀。pre怎么求呢?显然沿着原创 2016-04-15 12:41:00 · 604 阅读 · 0 评论 -
[bzoj1584]打扫卫生
题目大意把一个长度为n的序列分成若干段。 每一段的代价为其中不同的数的个数的平方。 最小化代价。DP设f[i]表示把[1..i]分成若干段的最优解。 那么显然有一个单调性f[i]<=f[i+1]。 我们可以枚举最后一段中不同的数的个数j。那么设b[j]表示最小的k满足[k,i]之间恰好有j个不同的数。 那么显然f[i]=min[1,i]不同的数的个数j=1(f[b[j]−1]+j2)f[i原创 2016-05-16 18:44:42 · 991 阅读 · 0 评论 -
[bzoj4517][SDOI2016]排列计数
题目大意a是关于n的排列。 问有多少符合条件的排列——恰有m个位置满足a[i]=i错排设dp[i]表示i个元素的错排方案数。 什么意思呢?就是关于i的排列其中不存在任意的a[j]=j。 答案显然就是Cmn∗dp[n−m]C_n^m*dp[n-m] 组合数快速算可以预处理阶乘以及阶乘的逆元。 怎么预处理出dp呢? 我们可以使用容斥原理: 例如dp[n],其实就是要满足n个条件——第i个条原创 2016-04-21 20:45:51 · 1059 阅读 · 0 评论 -
[bzoj十连测第五场 A]二进制的世界
题目大意不断询问一个数与当前集合内的一个数and/or/xor的最大值及最大值个数,并将该数加入集合中。分开来假如询问的数时B,集合内的数是A。 f[a,b]表示A的前8位是a,B的后8位是b,A的后8位与B的后8位位运算的结果最大值,个数也可以顺便保存一下。 询问时就枚举b,修改时就枚举a。#include<cstdio>#include<algorithm>#define fo(i,a,原创 2016-07-12 16:18:09 · 896 阅读 · 0 评论 -
[bzoj1172]Dream
题目大意n*m的矩形,从第一行开始依次取数。 第一行与最后一行只能取一个数,其余行可以取1~2个数。 问有多少种取数顺序使得所取的数乘积被p整除,答案模mo。DP我们想要知道乘积能否被p整除,所关心得只是乘积与p的gcd。 找出p的所有因子,可知其因子数量是三位数级别。 然后设f[i,j]表示前i行取了一些数使得乘积与p的gcd是p的第j个因子的方案。可以先在每一行内做,再进行转移。 当然原创 2016-07-03 09:57:49 · 506 阅读 · 0 评论 -
[51nod 1201]整数划分
题目大意把n分成若干个不同正整数求方案数。因确实挺每一种方案都可以由一种方式得到:初始只有一个1。 每一次把所有数加x(x为正整数),然后可以添加一个1。 于是用dp表示就是f[i,j]表示有i个数和为j。 那么根据上诉规则有递推式f[i,j]=f[i,j-i]+f[i-1,j-i] 最多会选多少个数?容易计算是根号级别的。#include<cstdio>#include<algorith原创 2016-07-04 21:27:38 · 677 阅读 · 0 评论 -
传球70分做法
题目描述 70分n<=1000dp容易看出被攻略的是连续一段。 设dp[l,r,0~1]表示攻略了[l,r],此时球在哪个端点。 我们需要预处理f与g。 f[i]表示从一个结点走至多走到顺时针走i步的位置情况下走到逆时针走1步的位置的概率。 假设顺时针走1步概率为p。 f[i]=1−p+p∗f[i−1]∗f[i]f[i]=1-p+p*f[i-1]*f[i] 1-p的概率直接走到,否则我原创 2016-07-15 22:03:19 · 408 阅读 · 0 评论 -
[CC LEBOXES]buy
题目大意n个袋子,第i个袋子有pi几率装有vi金钱,否则装有一颗宝石。 有m个食物,第i个食物需要ci的金钱和di颗宝石,求最优情况下,期望买下食物个数。折半宝石个数不超过n。 设f[i,j]表示买下i个食物使用了至多j颗宝石最少花费的钱,可以dp出来。 然后对于袋子,我们折半搜索,先搜索前半部分,并根据宝石数分段,每段按照金钱排序,并统计概率前缀和。 然后搜索后半部分,假如搜出的状态是(v原创 2016-08-15 22:48:53 · 474 阅读 · 0 评论 -
[CC PARSIN]math
题目描述预备知识sin(a+b)=sin(a)∗cos(b)+cos(a)∗sin(b)sin(a+b)=sin(a)*cos(b)+cos(a)*sin(b) cos(a+b)=cos(a)∗cos(b)−sin(a)∗sin(b)cos(a+b)=cos(a)*cos(b)-sin(a)*sin(b) cos(2a)=cos2(a)−sin2(a)=2cos2(a)−1cos(2a)=cos原创 2016-08-16 11:33:50 · 794 阅读 · 4 评论 -
[CF581 E]新车
题目描述Keith买了一辆新车,打算把自己的新车开到学校,给403的小伙伴们看看。 Keith家(多个)在城区,从城区到学校的路可以抽象成一个数轴,Keith家的坐标为W,学校的坐标为E。路上有很多加油站,每个加油站能提供92#,95#,98#三种汽油中的一种。由于Keith不缺钱,每到一个加油站,他都能加任意多的油。由于道路是双向的,Keith的车既能往左开,也能往右开。 1升汽油可以跑1千米原创 2016-08-16 15:35:47 · 1081 阅读 · 0 评论 -
Value
题目大意有一些物品每种只能取一次,可以以任意顺序取任意数量的物品,每取一种物品其余所有未取物品的价值要减去其的代价。最大化价值。一眼题按代价排序,那么显然从前往后取。 设f[i,j]表示做到i已经取了j个,倒着dp即可。#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(i,a,b)原创 2016-08-17 16:21:18 · 528 阅读 · 0 评论 -
[OICamp 2016 Day5A]鞍点
题目大意一个n*m矩形,每个格子的数都在[1,p],求至少有一个鞍点的矩形个数。(i,j)为鞍点定义为(i,j)的权值在第i行和第j列都严格最大。DP我们设f[i,j]表示目前有i个鞍点,鞍点的权值不大于j的矩形个数。 我们把这i行i列摆在一起。 现在枚举权值为j+1的鞍点个数x,那么就是从f[i,j]推到f[i+x,j+1],选x行选x列的方案Cxn−i∗Cxm−iC_{n-i}^x*C_{m原创 2016-09-18 21:25:56 · 537 阅读 · 0 评论 -
千帆渡
题目大意求两个序列的最长递增子序列DP设f[i,j]表示在a的前i里找一个与b的第j个作为最后一次匹配最大的序列长度。 则 f[i,j]=f[i−1,j]f[i,j]=f[i-1,j] f[i,j]=maxf[i−1,k]+1,b[k]<b[j],a[i]=b[j]f[i,j]=\max{f[i-1,k]}+1,b[k]<b[j],a[i]=b[j] 即f[i,j]=maxf[i−1,k]+原创 2016-09-08 16:45:51 · 616 阅读 · 0 评论 -
[51nod 1614]刷题计划
题目描述大赛将至,摆在你面前的是n道题目,第 i(1 ≤ i ≤ n) 道题目能提升 ai 点智力值,代码量为 bi KB,无聊值为 ci ,求至少提升m点智力值的情况下,所做题目代码量之和*无聊值之和最小为多少。最小乘积生成树把每种方案的代码量和当做横坐标,无聊值和当做纵坐标,每种方案都可以用一个二维平面的点表示。 首先同在一个反比例函数上的点横纵乘积相同,我们要找一个点横纵乘积最小。 首先用原创 2016-09-08 17:14:06 · 1244 阅读 · 0 评论 -
周末晚会
题目描述Irena和Sirup正准备下个周末的Party。为这个Party,他们刚刚买了一个非常大的圆桌。他们想邀请每个人,但他们现在不知道如何分配座次。Irena说当有超过K个女孩座位相邻(即这些女孩的座位是连续的,中间没有男孩)的话,她们就会说一整晚的话而不和其他人聊天。 Sirup没有其他选择,只有同意她。然而,作为一名数学家,他很快地痴迷于所有可能方案。 题目说明: N个人围绕着圆桌坐原创 2016-09-24 16:20:04 · 852 阅读 · 0 评论 -
[CF712D]Memory and Scores
题目大意两个人van游戏,第一个人初始拿了一个数a,第二个人初始拿了一个数b。 它们van了t轮,每轮每人都会在[-k,k]中等概率选一个数加到自己的数中。 问第一个人最后手上的数大于第二个人手上的数的概率。 乘以(2k+1)^t模10^9+7 k<=1000,t<=100,a,b<=1000DP设f[i,j]表示做完i轮,第一个人的分数与第二个人的分数差为j的概率。 我们发现可取区间[-原创 2016-11-03 10:55:16 · 649 阅读 · 0 评论 -
[51nod 1149]Pi的递推式
题目大意F(x)当0<=x<4时等于1,x>=4时等于F(x-1)+F(x-pi) 求F(n)观察递推式n<4就输出一,接下来只讨论n>=4的情况 根据观察递推式,我们可以转化问题: 给你一个n,每次可以减一或减pi,直至减到小于4,求方案数。 减看起来不直观,改为加: 从一个0开始,每次加1或加pi,直至加到与n相差在4以内,求方案数。 那么最终结果在(n-4,n] 假如最后一次加了原创 2016-11-04 17:15:04 · 857 阅读 · 0 评论 -
Market
题目大意每个物品有三个权值:代价、价值、从哪个时间后可以购买 现在多次询问,每次询问给出你的钱数、购买时间,每个物品至多买一次,问最大价值。 代价<=10^9,价值<=300DP先离线做,枚举时间。每个询问挂在时间上。 现在我们不能用传统01背包,因为代价超大。 可以考虑设f[j]表示价值为j时最小的代价。 为了方便得到答案,f[j]表示为价值>=j时最小的代价,后缀min一发就好了。原创 2016-11-05 16:07:17 · 517 阅读 · 0 评论