随笔分类 - 动态规划
摘要:容易发现跟树没什么关系,可以预处理出每个点若走向分叉点期望走多少步才能回到上个存档点,就变为链上问题了。考虑dp,显然有f[i][j]表示在i~n中设置了j个存档点,其中i设置存档点的最优期望步数。转移枚举下一个存档点设在哪,则有f[i][j]=min(f[k][j-1]+d[i][k]),其中d[
        阅读全文
                
摘要:设f[i][j]为第i天到达j号城市的方案数,转移显然,答案即为每天在每个点的方案数之和。矩乘一发即可。
        阅读全文
                
摘要:相当于将线段划分成两个集合使集合内线段不相交,并且可以发现线段相交等价于逆序对。也即要将原序列划分成两个单增序列。由dilworth定理,如果存在长度>=3的单减子序列,无解,可以先判掉。 这个时候有两种显然的暴力。 将点集划分成两部分使内部无边显然就是二分图,于是第一种暴力是在逆序对之间连边,答案
        阅读全文
                
摘要:暴力dp非常显然,设f[i][0/1]表示i号点不选/选时i子树内的答案,则f[i][0]=Σf[son][1],f[i][1]=a[i]+Σmin(f[son][0],f[son][1])。 注意到B的部分分,可以想到每次修改只会对修改点到根的路径上的点的dp值产生影响。 考虑如何优化修改路径这一
        阅读全文
                
摘要:设f[i][0/1/2/3/4/5]表示i子树中选一条链不包含根/i子树中选一条链包含根但不能继续向上延伸/i子树中选一条链可以继续向上延伸/选两条链不包含根/选两条链包含根但不能继续向上延伸/选两条链能继续向上延伸,大力讨论即可。代码看起来很(mo)有(ming)意(qi)思(miao)。
        阅读全文
                
摘要:注意到A+B+C很小,容易想到设f[i][A][B][C]为第i次攻击后有A个血量为1、B个血量为2、C个血量为3的期望伤害,倒推暴力转移即可。
        阅读全文
                
摘要:前者是后者各方面的强化版。 容易想到设f[i][j]表示i子树中第j小的是i的方案数(即只考虑相对关系)。比较麻烦的在于转移。考虑逐个合并子树。容易想到枚举根原来的排名和子树根原来的排名,算一发组合数。具体要考虑的是当前有n个0、m个1,将他们排成一排,要求其中第x个0在k号位,第y个1在k号位的右
        阅读全文
                
摘要:首先考虑是棵树的话怎么做。可以发现相当于在树上选择一些长度>=2的路径使其没有交,同时也就相当于用一些没有交的路径覆盖整棵树。 那么设f[i]为覆盖i子树的方案数。转移时考虑包含根的路径。注意到每条跨根的路径都是由两条子树内到根的路径组成,只需要先统计出所有路径不跨根的方案数,再乘上包含根的路径的配
        阅读全文
                
摘要:考虑求出所有MST的权值和再除以方案数,方案数显然是2mn。 按位考虑,显然应该让MST里的边高位尽量为0。那么根据最高位是0还是1将点集划分成两部分,整张图的MST就是由两部分各自的MST之间连一条最小边得到的。两部分的MST权值和可以dp得到,即设f[i][j]表示i个点权值在0~2j-1的MS
        阅读全文
                
摘要:设f[i][j]为由i号点开始在子树内走j步最多能经过多少格点,g[i][j]为由i号点开始在子树内走j步且回到i最多能经过多少格点,转移显然。
        阅读全文
                
摘要:不妨不管j<=i的限制。由卢卡斯定理,C(i,j) mod k=0相当于k进制下存在某位上j大于i。容易想到数位dp,即设f[x][0/1][0/1][0/1]为到第x位时是否有某位上j>i,是否卡n、m的限制的方案数。
        阅读全文
                
摘要:首先要冷静下来发现这仅仅是在划分区间。显然若有相邻的数字相同应当划分在同一区间。还有一个显然的性质是区间的两端点应该相同且选择的就是端点的数。瞬间暴力dp就变成常数极小100002了。可以继续斜率优化然而懒了。
        阅读全文
                
摘要:按层dp,f[i][j]表示已扩展i子集的节点当前在第j层的最小代价,预处理点集间距离即可。
        阅读全文
                
摘要:跑一遍dij根据最短路DAG进行拓扑排序,按拓扑序dp即可。wa了三发感觉非常凉。
        阅读全文
                
摘要:看到比值先二分答案。于是转化成一个非常裸的树形背包。直接暴力背包的话复杂度就是O(n2),因为相当于在lca处枚举每个点对。这里使用一种更通用的dfs序优化树形背包写法。https://www.cnblogs.com/zzqsblog/p/5537440.html 即设f[i][j]为在dfs序第i
        阅读全文
                
摘要:注意到模数很小,容易想到使用卢卡斯定理,即变成一个2333进制数各位组合数的乘积。对于k的限制容易想到数位dp。可以预处理一发2333以内的组合数及组合数前缀和,然后设f[i][0/1]为前i位是否卡限制的贡献就很好dp了。为什么大家都要化式子呢。
        阅读全文
                
摘要:如果值域不大,容易想到设f[i][j]为第i个学校选了j的方案数,枚举上一个学校是哪个选了啥即可,可以前缀和优化。于是考虑离散化,由于离散化后相同的数可能可以取不同的值,所以枚举第一个和其所选数(离散化后)相同的学校是哪个,考虑这一段里选几个学校怎么选数,组合数即可。各种显然的优化后即可做到O(n3
        阅读全文
                
摘要:首先kmp求出每个子串能放在哪些位置。接下来的两部分贪心和状压都可以,各取比较方便的。 最大值考虑贪心。考虑枚举子串的左端点出现顺序,在此基础上每个子串的位置肯定都应该尽量靠前,有是否与上个子串有交两种选择,如果有交一定会使交集最小,于是枚举第一个子串出现位置并暴力枚举4!*23种情况。 最小值考虑
        阅读全文
                
摘要:下称放置守卫的点为监控点。设f[i][j]为i子树中深度最大的未被监视点与i的距离不超过j时的最小代价,g[i][j]为i子树中距离i最近的监控点与i的距离不超过j且i子树内点全部被监视时的最小代价。开始觉得这只能设成三维状态对这种二维的纠结了半天要怎么处理子树内有点未被监视但监控点的范围可以延伸到
        阅读全文
                
摘要:分两种情况。三点两两lca相同:在三点的lca处对其统计即可,显然其离lca距离应相同;某点在另两点lca的子树外部:对每个点统计出与其距离x的点有多少个即可。 可以长链剖分做到线性,当然不会。
        阅读全文
                

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