随笔分类 -  3.————dp————

摘要:设f[i]是以i为开头的好子序列的个数 那么有$f[i]=\sum\limits_{j=i+a[i]+1}^{N+1}{f[j]*C_{j-i-1}^{a[i]}}$(设f[N+1]=1)就是以i为开头选出一个好子数组的每种情况*再把它拼到后面的一个好子序列的数量 随便用什么方法预处理一下组合数就行 阅读全文
posted @ 2018-10-27 21:05 Ressed 阅读(254) 评论(0) 推荐(0)
摘要:首先,应该尽量让吃饭慢的排在前面,先按这个排个序 然后再来决定每个人到底去哪边 设f[i][j]是做到了第i个人,然后1号窗口目前的总排队时间是j,目前的最大总时间 有这个i和j的话,再预处理出前i个人的排队总时间sum[i],可以知道在2号窗口的排队时间是sum[i]-j 拿着两个去更新答案就行了 阅读全文
posted @ 2018-10-22 22:27 Ressed 阅读(146) 评论(0) 推荐(0)
摘要:记f[i][j]是以i号为结尾的、公差为j的的个数(不包括只有i的情况) 那么就有$f[i][i-i']=\sum{(f[i'][i-i']+1)}$之类的东西 最后再加个n就行啦 而且公差有可能有负的,都加个20000好了 阅读全文
posted @ 2018-10-22 22:06 Ressed 阅读(90) 评论(0) 推荐(0)
摘要:直接设f[i][j][k][l][2]是在(i,j)时两人分数是k,l,复杂度会爆掉 但其实只需要知道两人分数只差就行了 所以设f[i][j][k][2],k是分数之差%(K+1),最后一位表示该谁走了 阅读全文
posted @ 2018-10-13 10:28 Ressed 阅读(139) 评论(0) 推荐(0)
摘要:(警告:本篇博客包含大量人类本质内容) 先处理出来lca,然后就只需要知道从每个点到他的父亲、和从他的父亲到这个点的期望时间就可以了 我们设f[x]为x到他父亲的期望时间;g[x]为从x的父亲到x的期望时间(注意到这两个是不一样的) 只考虑怎么算f,g是类似的 从某个点想走到他父亲时,情况会有:直接 阅读全文
posted @ 2018-10-06 20:57 Ressed 阅读(280) 评论(0) 推荐(0)
摘要:设f[i][j]为把i拆成j个不重复的、大于0小于等于N的数的方案数 我们考虑一个方案是怎么来的:(初始状态是f[0][0]=1) 如果这个方案里有1,那它是先把原来的状态的每个数加1、然后再增加一个1 如果这个方案没有1,那它是把原来的状态直接每个数加1得来的 就对应了方程$f[i][j]=f[i 阅读全文
posted @ 2018-10-01 20:51 Ressed 阅读(129) 评论(0) 推荐(0)
摘要:算出来每个数被计算答案的期望次数就可以 考虑这个次数,我们可以把一次合并反过来看,变成把一个数+1然后再复制一个 记f[i][j]为一共n个数时第j个数的期望次数,就可以得到期望的递推公式,最后拿f[N]乘一乘就行了 要注意每一位的期望次数是不一样的..不存在什么中间的次数一样之类的... 阅读全文
posted @ 2018-10-01 19:42 Ressed 阅读(213) 评论(0) 推荐(0)
摘要:设f[i][j]为到达(i,j)这个位置的最小操作数 就有$f[i][j]=min\{f[i-1][j+Y[i-1]],f[i-1][j-X[i-1]*k]+k\}$ 然后考虑优化一下转移: 对于一系列模x[i-1]相同的高度,它们都可以转移到模x[i-1]相同的高度、而且在它们上边的点,所以只要从 阅读全文
posted @ 2018-09-25 21:49 Ressed 阅读(164) 评论(0) 推荐(0)
摘要:设f[i][j][k][b]表示在A串第i位、这是第j组、B串第k位、i号选不选(b=0/1) 那么就有$f[i][j][k][1]=(A[i]==B[k])*(f[i-1][j-1][k][0]+f[i-1][j][k-1][1]+f[i-1][j-1][k-1][1])$,$f[i][j][k] 阅读全文
posted @ 2018-09-25 21:40 Ressed 阅读(135) 评论(0) 推荐(0)
摘要:我们都做过一道题(?)货币兑换,是用cdq分治来解决不单调的斜率优化 现在它放到了树上.. 总之先写下来dp方程,$f[i]=min\{f[j]+(dis[i]-dis[j])*p[i]+q[i]\} ,j是i的祖先,dis[i]-dis[j]<=l[i]$ ,其中dis[i]表示1号点到i号点的距 阅读全文
posted @ 2018-09-24 18:32 Ressed 阅读(219) 评论(0) 推荐(0)
摘要:首先floyd求出每两点间的距离(注意自己到自己的距离要设成0) 然后就是dp了 一开始照着Lifeguards的样子,钦定了一下i这个点一定要选,然后发现复杂度不对,还想了好长时间优化 然后一翻题解,直接两种状态选或不选分开算O(1)转移多好(所以年轻人不要整天满脑子都是钦定钦定的) 但为什么Li 阅读全文
posted @ 2018-09-24 17:47 Ressed 阅读(211) 评论(0) 推荐(0)
摘要:由范围可以想到状压dp 两个点(再加上原点)是可以确定一个抛物线的,除非它们解出来a>=0,在本题中是不合法的 这样的话,我们可以预处理出由任意两个点确定的抛物线所经过的所有的点(要特别规定一下自己和自己确定的抛物线只经过自己) 然后设状态s表示目前已经有哪些点被击中了,然后我们钦定这次就要打那个最 阅读全文
posted @ 2018-09-24 17:37 Ressed 阅读(250) 评论(0) 推荐(0)
摘要:dp..dp的时候不能设f[N][x1][x2][x3][x4],会T,要把N省略,然后通过1/2/3/4牌的数量来算已经走到哪一个了 阅读全文
posted @ 2018-09-19 22:11 Ressed 阅读(140) 评论(0) 推荐(0)
摘要:显然可以先把被覆盖掉的区间去掉,然后排个序,左、右端点就都是单调的 设f[i][j]表示前i个区间中删掉j个,而且钦定i不能删的最大覆盖长度 (如果不钦定,就要有一个删掉的状态,那我无法确定前面的到底到哪是没删的) 那么有$f[i][j]=max\{f[k][j-(i-k-1)]+R[i]-max( 阅读全文
posted @ 2018-09-19 21:58 Ressed 阅读(469) 评论(0) 推荐(0)
摘要:我们先设f[i][j]表示长度为i,以j结尾的不降子序列个数,$f[i][j]=\sum{f[i-1][k]},A[k]<=A[j],k<j$,用树状数组优化一下可以$O(n^2logn)$求出来 然后我们让g[i]是长度为i的不降子序列的个数,答案就是$\sum{g[i]*(N-i)!-g[i+1 阅读全文
posted @ 2018-09-18 09:00 Ressed 阅读(175) 评论(0) 推荐(0)
摘要:可以发现,只要存在连续k个相同的,这个情况就一定是合法情况 然而这个不太好算,我们算不存在k个相同的,然后用$m^n$把它减掉 设f[i]为前i个,没有连续k个的 显然$f[i]=m^i ,i<K$ 然后我们现在想把f[i]转移过来,只要取f[i-k+1]..f[i-1]的所有情况,然后在每个的后面 阅读全文
posted @ 2018-09-17 14:15 Ressed 阅读(233) 评论(0) 推荐(0)
摘要:要求出两点间距离==0(mod3) 的数量,然后除以(n*n) 设f[i][j]为i的子树到i的距离==j(mod3)的数量,然后做树形dp即可 因为要最简,所以要求一下gcd,然后除下去 阅读全文
posted @ 2018-09-14 21:20 Ressed 阅读(171) 评论(0) 推荐(0)
摘要:N个点,每个点发出一条边,那么这个图的形状一定是一个基环树森林(如果有重边就会出现森林) 那我做f[0][x]和f[1][x]分别表示对于x子树,x这个点选还是不选所带来的最大价值 然后就变成了这好几个环上不能选相邻的点,最大的价值和 我们把这个环从N到1处断开,然后钦定一下1选还是不选,统计一下答 阅读全文
posted @ 2018-09-14 20:44 Ressed 阅读(152) 评论(0) 推荐(0)
摘要:设f1[i]表示以1..i中某个合法序列的长度,而且最后一位是较大的 f2[i]表示以1..i中某个合法序列的长度,而且最后一位是较小的 那么就有$f1[i]=max\{f2[j]+1\},(j<i,h[j]<h[i])$,f2同理 本来想直接建线段树来维护这个最大值的,但是似乎不需要: 对于f1, 阅读全文
posted @ 2018-09-13 22:55 Ressed 阅读(167) 评论(0) 推荐(0)
摘要:我们一位一位地来做,每次判断这一位能否放0,而且要在满足前几位的情况下。用dp来判断 具体来说,设f[i][j]表示前i个划分成j个区间能否满足,那么我们会有转移trans[i][k+1],当区间[i,k]的和在某些位上不是1时trans[i][k+1]=1 这些位,就是正在做的这位和它之前确定下来 阅读全文
posted @ 2018-09-13 22:41 Ressed 阅读(170) 评论(0) 推荐(0)