随笔分类 -  动态规划

摘要:斯坦纳树板子题。 考虑状压dp,设f[i][j][S]表示当前在点(i,j)考虑转移,其所在的联通块包含的关键点集(至少)为S的答案。 转移时首先枚举子集,有f[i][j][S]=min{f[i][j][x]+f[i][j][y]-a[i][j]} (x&y=0,x|y=S)。 然后考虑从点(i,j 阅读全文
posted @ 2019-01-11 20:05 Gloid 阅读(185) 评论(0) 推荐(0)
摘要:有很多比较显然的性质。首先每个城市(除1外)至多被连通一次,否则没有意义。其次将城市按水位从大到小排序后,用以连通的城市集合是一段前缀,并且不应存在比1城市还小的。然后如果确定了选取的城市集合,每次选择也应该是连续的一段,且应从小到大选,这样保证了将其他城市的水尽量分到1,而不是被另外的城市分流。同 阅读全文
posted @ 2018-12-29 00:06 Gloid 阅读(135) 评论(0) 推荐(0)
摘要:打表可以发现相当于不存在长度>=3的递减子序列。 考虑枚举在哪一位第一次不卡限制。注意到该位一定会作为前缀最大值。判掉已确定位不合法的情况后,现在的问题即为求长度为i、首位>j的合法排列个数,设其为g[i][j]。 由于首位>j,1~j在排列中一定依次出现,并且在j出现之前,>j的部分也一定单增。于 阅读全文
posted @ 2018-12-27 21:19 Gloid 阅读(226) 评论(0) 推荐(0)
摘要:直接给了一个置换群(当然要自己手动加上不洗牌的情况)。考虑求不动点数量即可。对于一个置换,求出所有循环的长度,然后设f[i][x][y]为给前i个循环着色后,用了x张红色卡片、y张绿色卡片的方案数,dp一发即可。 upd:为啥我写的应该不是假算法却好像也被hack掉了?不管了已经忘了这是啥题肯定哪写 阅读全文
posted @ 2018-12-23 16:12 Gloid 阅读(175) 评论(0) 推荐(0)
摘要:离散化后,容易想到设f[i][j]为i节点权值为j的概率,不妨设j权值在左子树,则有f[i][j]=f[lson][j](pi·f[rson][1~j]+(1-pi)·f[rson][j~m])。 考虑用线段树合并优化这个dp。记录前缀和,合并某节点时,若某棵线段树在该节点处为空,给另一棵线段树打上 阅读全文
posted @ 2018-12-21 13:00 Gloid 阅读(210) 评论(0) 推荐(0)
摘要:即求所有情况的最大伤害之和。容易发现应该先打强化牌,至少打一张攻击牌。同样显然的是强化牌和攻击牌都应该按从大到小的顺序打。进一步可以发现,只要还有强化牌,就应该使用(当然至少留一次攻击的机会)。 于是将强化牌和攻击牌各自从大到小排序。显然可以将其分开考虑。对强化牌,设f[i][j]为前i张牌抽到j张 阅读全文
posted @ 2018-12-18 21:41 Gloid 阅读(239) 评论(0) 推荐(0)
摘要:显然的做法是暴力枚举非树边所连接两点的选或不选,大力dp。考场上写的是最暴力的O(3n-mn),成功比大众分少10分。容斥或者注意到某些枚举是不必要的就能让底数变成2。但暴力的极限也就到此为止。 每次重新dp做了大量重复的事,考虑从减少重复计算方面优化。先跑一遍没有限制的树形dp。将非树边所连接的点 阅读全文
posted @ 2018-12-18 01:13 Gloid 阅读(344) 评论(0) 推荐(0)
摘要:由裴蜀定理,子集S有解当且仅当gcd(S,P)|w。 一个显然的dp是设f[i][j]为前i个数gcd为j的选取方案。注意到这里的gcd一定是P的约数,所以状态数是n√P的。然后可以通过这个得到gcd是j约数的选取方案。复杂度O(n√PlogP)。 考虑优化。注意到每个数取gcd后的贡献仅与其和P的 阅读全文
posted @ 2018-12-15 13:59 Gloid 阅读(170) 评论(0) 推荐(0)
摘要:显然答案为Σkb·(n-k)a·C(n-k+1,k)。并且可以发现ΣC(n-k,k)=fibn。但这实际上没有任何卵用。 纯组合看起来不太行得通,换个思路,考虑一个显然的dp,即设f[i][j][0/1]为前i为选了j个1其中第i位是0/1的方案数。这样当然能求出答案,复杂度O(n2)。 注意到ab 阅读全文
posted @ 2018-12-14 00:20 Gloid 阅读(217) 评论(0) 推荐(0)
摘要:设f[i][j]为前i个划成j段的最小代价,枚举上个划分点转移。容易想到这个dp有决策单调性,感性证明一下比较显然。如果用单调栈维护决策就不太能快速的求出逆序对个数了,改为使用分治,移动端点时树状数组维护即可,类似莫队的每次都在原有基础上更新。注意更新时先加再减。感觉复杂度非常玄学丝毫不能看出为啥只 阅读全文
posted @ 2018-12-08 23:54 Gloid 阅读(306) 评论(0) 推荐(0)
摘要:线段树的任意一棵子树都相当于节点数与该子树相同的线段树。于是假装在树形dp即可,记忆化搜索实现,有效状态数是logn级别的。 阅读全文
posted @ 2018-12-08 21:17 Gloid 阅读(236) 评论(0) 推荐(0)
摘要:每种父亲编号小于儿子编号的有标号二叉树的出现概率是相同的,问题相当于求所有n个点的此种树的所有结点两两距离之和。 设f[n]为答案,g[n]为所有此种树所有结点的深度之和,h[n]为此种树的个数。 枚举左右子树大小,则有f[n]=Σ{[f[i]+(g[i]+h[i]*i)·(n-i)]·h[n-i- 阅读全文
posted @ 2018-12-08 12:07 Gloid 阅读(158) 评论(0) 推荐(0)
摘要:对于每个区间[l,r],显然右端点r是必须放置守卫的。考虑其不能监视到的点,构成一段段区间。一个非常显然但我就是想不到的性质是,对于这样的某个区间[x,y],在(y+1,r)内的点都是不能监视到这个区间内的任何一点的,证明考虑一下斜率之间的关系即可。于是该区间的最右一个守卫可以放置在y,也可以放置在 阅读全文
posted @ 2018-12-07 00:24 Gloid 阅读(151) 评论(0) 推荐(0)
摘要:设f[i][j][0/1]为前i位选j段时其中第i位选/不选最多能匹配到哪,转移时f[i][j][0]→f[i+1][j][0],f[i][j][1]→f[i+1][j][0],f[i][j][1]→f[i+1][j][1],f[i][j][0]→f[i+1][j+1][1]。失配时找到最后一位相同 阅读全文
posted @ 2018-12-03 22:52 Gloid 阅读(220) 评论(0) 推荐(0)
摘要:容易猜到能选择的黑点个数是一个连续区间。那么设f[i][j]为i子树内选j个点形成包含根的连通块,最多有几个黑点,g[i][j]为最少有几个黑点,暴力dp是O(n2)的,求出每个连通块大小对应的黑点数量取值范围即可。 惊觉差点不会树形背包了。注意不要出现任何非法转移,即使看上去无伤大雅。 阅读全文
posted @ 2018-12-03 21:48 Gloid 阅读(149) 评论(0) 推荐(0)
摘要:首先二分答案简化一下问题,现在只有0和1了,要求最后剩下的是1。再简化一下考虑没有已固定的位置怎么做。考虑每个位置由其合并到的位置连边,显然这样形成了一棵三叉树。设f[i]为使得某位置为1其子树至少要放多少个1即可,转移显然。加上已固定位置也类似,修改dp初值即可。 阅读全文
posted @ 2018-12-02 23:14 Gloid 阅读(272) 评论(0) 推荐(0)
摘要:显然被留下的宝石应该贡献至少一位,否则就可以扔掉。所以如果n-k>=logw,直接输出所有数的or。现在n变得和k同阶了。于是设f[i][j]为前i个数or为j时至少选几个数,转移显然。当然可以只开一维。 阅读全文
posted @ 2018-12-02 19:36 Gloid 阅读(265) 评论(0) 推荐(0)
摘要:设f[i][j]为前i种强度选了j种且其中第i种选时前i个的最小误差。转移枚举上个选啥前缀和优化即可。 阅读全文
posted @ 2018-12-02 13:56 Gloid 阅读(210) 评论(0) 推荐(0)
摘要:一个显然的dp是设f[i][j]为i子树内权值<=j时的答案,则f[i][j]=Σf[son][j],f[i][a[i]]++,f[i][a[i]+1~n]对其取max。这样是可以线段树合并的,但实在太弱了不太会。 另一种做法是考虑扩展经典的单调队列优化LIS的做法,维护子树内答案为k时最小的最大值 阅读全文
posted @ 2018-12-01 02:01 Gloid 阅读(209) 评论(0) 推荐(0)
摘要:首先将每个括号序列转化为三元组(ai,bi,ci),其中ai为左括号-右括号数量,bi为前缀最小左括号-右括号数,ci为序列长度。问题变为在满足Σai=0,bi+Σaj>=0 (j<i)的情况下,最大化Σci。 考虑在确定了选哪些序列的情况下如何排列能够尽量满足条件。显然应该把ai>0的放在前面,< 阅读全文
posted @ 2018-11-30 21:58 Gloid 阅读(364) 评论(0) 推荐(0)