随笔分类 - 动态规划
摘要:拿走一个区间的代价只与最大最小值有关,并且如果最后一次拿走包含区间右端点的子序列一定不会使答案更劣,于是设f[i][j][x][y]为使i~j区间剩余最小值为x最大值为y且若有数剩余一定包含j的最小代价,特别地f[i][j][0][0]表示取完i~j区间的最小代价。转移时考虑j最后和哪一段一起拿走,
        阅读全文
                
摘要:容易想到设f[i][j][k]为i~j区间以k为根是否能构成bst。这样是O(n4)的。考虑将状态改为f[i][j][0/1]表示i~j区间以i-1/j+1为根能否构成bst。显然如果是i-1作为根的话i~j区间都在它的右子树,所以转移时枚举右子树的根并判断是否合法,j+1类似。
        阅读全文
                
摘要:设f[i][j][k]为将i~j的字符最终合并成k的答案。转移时只考虑最后一个字符是由哪段后缀合成的。如果最后合成为一个字符特殊转移一下。 复杂度看起来是O(n32k),实际常数极小达到O(玄学)。 upd:突然发现根本没在bzoj上交。bzoj的数据输入中没有空格。
        阅读全文
                
摘要:感觉上这个题是可以直接暴力的,每次根据一段连续最小值个数的奇偶性决定是否划分区间,递归处理。然而写起来实在太麻烦了。 设f[i][j]为以i为左端点合并出j时的右端点。则有f[i][j]=f[f[i][j-1]+1][j-1]。类似于区间dp。
        阅读全文
                
摘要:首先按数据值排序,那么连续一段区间的dfs序一定也是连续的。 将权值离散化,设f[i][j][k]为i到j区间内所有点的权值都>=k的最小代价,转移时枚举根考虑是否修改权值即可。
        阅读全文
                
摘要:设f[i][j][0/1]表示i~j这段区间上一次选择的是最左/最右人的方案数。转移显然。
        阅读全文
                
摘要:容易想到设f[i]为杀死i号怪物所消耗的最小体力值,由后继节点更新。然而这显然是有后效性的,正常的dp没法做。 虽然spfa已经死了,但确实还是挺有意思的。只需要用spfa来更新dp值就可以了。dij看起来也差不多。 更新部分写的看起来就很慢很能优化一波,在luogu上T一个点,然而实在太懒了就算了
        阅读全文
                
摘要:显然可以dp:设f[i]为前i个人最多能分多少组,则f[i]=max{f[j]}+1 (cmax<=i-j<=dmin)。 容易发现d的限制是一段连续区间,二分或者随便怎么搞都行。c则有点麻烦,考虑分治。找到区间中c最大的位置,处理左边区间再向右边(包括该位置)转移,最后处理右边区间(当然就是cdq
        阅读全文
                
摘要:设f[i]为由i开始遍历完子树内所要求的点的最短时间,g[i]为由i开始遍历完子树内所要求的点最后回到i的最短时间。则g[i]=Σ(g[j]+2),f[i]=min{g[i]-g[j]+f[j]-1}。 然后由父亲答案还原。因为上面的dp用到了max似乎不太好搞,于是记录一下最大值是用了哪棵子树以及
        阅读全文
                
摘要:显然贪心地有尽量先往容量大的背包里放。设f[i]为i子集物品最小占用背包数,g[i]为该情况下最后一个背包的剩余容量,转移显然。
        阅读全文
                
摘要:显然可以转化为一个阶梯状01矩阵每行每列取一个使权值和为k的方案数。直接做不可做,考虑设f[i][j]为前i行权值和至少为j,即在其中固定了j行选1的方案数。设第i行从1~a[i]列都是1且a[i]+1列是0,则f[i][j]=f[i-1][j]+f[i-1][j-1]*(a[i]-j+1)。剩下的
        阅读全文
                
摘要:看到数据范围就可以猜到数位dp了。显然对于一个数最后移到的位置应该是其中位数。于是考虑枚举移到的位置,那么设其左边和为l,左右边和为r,该位置数为p,则需要满足l+p>=r且r+p>=l。同时为了防止重复,枚举的应该是最左的能移到的位置,那么还需要满足l<p+r。算的时候枚举p、l、r,统计方案数,
        阅读全文
                
摘要:设f[i]为i在子树内不与充电点连通的概率。则f[i]=(1-pi)·∏(1-qk+qk·f[k])。 然后从父亲更新答案。则f[i]=f[i]·(1-qfa+qfa*f[fa]/(1-qfa+qfa*f[i]))。 比较好想的dp。注意第二个式子可能会除0。
        阅读全文
                
摘要:可以发现每次都对后缀+1是不会劣的。考虑dp:设f[i][j]为前i个数一共+1了j次时包含第i个数的LIS长度。则f[i][j]=max(f[i][j-1],f[k][l]+1) (k<i,l<=j,a[i]+j>=a[k]+l)。容易发现这里是二维偏序,相当于查询(j,a[i]+j)左下部分的最
        阅读全文
                
摘要:之前听说过一种dp套dp的trick,大致是用另一个dp过程中用到的一些东西作为该dp的状态。这个题比较类似。 考虑求LIS时用到的单调队列。设f[S]为所选取集合为S的方案数,其中在单调队列内的标2不在的标1。转移时考虑选择一个数是否合法,这只需要保证LIS长度不超过k且所给数的相对顺序不变。 注
        阅读全文
                
摘要:二维的dp非常显然,但这也没有什么优化的余地了。 注意到最后的方案中只有产生贡献的位置是有用的,剩下的部分可以在该范围内任意选取。 所以我们考虑设f[i]为i号位最后产生贡献的答案,则f[i]=max{f[j]+1} (i-j>=a[i]-a[j],a[i]>a[j])。 观察这个限制,即为i-a[
        阅读全文
                
摘要:容易发现这是一个有各种玄妙性质的完全背包计数。 对于每个质数,将其选取个数写成ax+b的形式,其中x=S/pi,0<b<x。那么可以枚举b的部分提供了多少贡献,多重背包计算,a的部分直接组合数即可。多重背包计数可以前缀和优化。
        阅读全文
                
摘要:显然当x中没有相邻的1时该式成立,看起来这也是必要的。 于是对于第一问,数位dp即可。第二问写出dp式子后发现就是斐波拉契数列,矩阵快速幂即可。
        阅读全文
                
摘要:数独立集显然是可以树形dp的,问题在于本质不同。 假设已经给树确立了一个根并且找到了所有等效(注意是等效而不是同构)子树,那么对转移稍加修改使用隔板法就行了。 关键在于找等效子树。首先将树的重心(若有两个则加一个点作为唯一重心)作为根。这样任意极大等效子树(比如某两个等效子树里面的一部分等效,那么里
        阅读全文
                
摘要:容易发现如果求出最后的序列,只要算一下LIS就好了。序列用平衡树随便搞一下,这里种一棵splay。
        阅读全文
                

 浙公网安备 33010602011771号
浙公网安备 33010602011771号