随笔分类 - 各种DP
摘要:传送门 矩阵很大,但是发现 n 很小,从这边考虑,对于一个一堆小矩阵放在一起的情况 考虑把每一块单独考虑然后方案再乘起来 但是这些奇怪的东西很不好考虑 所以暴力一点,直接拆成一个个小块 但是这样我们还要考虑到小矩形的限制,设 f[i][S] 表示现在考虑完第 i 个小块,小矩形的限制满足
阅读全文
摘要:传送门 考虑 DP 容易想到设 f[i][S] 表示考虑到第 i 个物品,当前拥有物品集合为 S 时最优策略下的期望得分 但是这样不能保证是最优策略,不知道后面的结果 换种状态,设 f[i][S] 表示已经从 i+2 考虑到最后一个物品,现在考虑第 i+1 个,且从 $1
阅读全文
摘要:传送门 二叉堆计数显然可以递归处理 考虑两个二叉堆合并时的情况: 最小的数肯定在根的位置 设此时总的节点数为 tot,堆A的节点数为 a,我们显然可以从 tot-1 个数中随意选出 a 个数放到堆A中,剩下的数放到堆B中(tot-1是因为根的值已经确定了) 考虑堆$A
阅读全文
摘要:传送门 显然的 dp 设 f[i] 表示点击第 i 个音符时的最大价值,t[i] 表示音符 i 的准备时间 那么可以枚举 1 到 i-t[i] 的所有音符,如果 j ,如果 j+t[j] 小于等于 i ,那么 $f[i]=max(f[i],f[j]+t[i]*
阅读全文
摘要:传送门 发现 k<=10^9<13! 所以只有最后几位会变 前面一大段都是固定的 考虑求前面一大段的贡献 n最大就 9 位,直接数位DP就好了(爆搜也是可以的) 考虑后面几位的贡献 用逆康托展开求出每一位的值然后暴力判断就好了 代码有一些细节:
阅读全文
摘要:传送门 斯坦纳树 给一个联通图,求 k 个关键点联通的最小生成树权值 设 f[o][i] 表示当前关键点选择状态为 o ,以点 i 为根的树的最小权值 初始 f[1<<(i-1)][i]=val[i] ,val[i] 表示点 i 的权值 那么从小到大枚举状态 o 对于
阅读全文
摘要:传送门 点分治入门题 首先可以直接枚举所有两点的lca强行dp 设 f [ x ] [ 0/1/2 ] 表示节点 x 在模3意义下,x 的子树所有节点到 x 的距离为 0/1/2 时的方案数 初始 f [ x ] [ 0 ] =1 (本身到自己有一种方案) 转移就枚举所有儿子
阅读全文
摘要:传送门 看到指定的总节点数小于等于 300000 就知道要搞虚树了 考虑如何在虚树确定每个议事处控制的节点数量 可以两遍dfs 第一遍求儿子对父亲的影响,第二遍求父亲对儿子影响 注意搜索顺序,这样就可以把影响扩展到其他子树了 如图: 初始时只有本身被影响 经过第一遍dfs后父亲被影响: 经过第二遍d
阅读全文
摘要:传送门 虚树DP经典题 首先有一个显然的O(nm)的树形DP 以 1 号节点为根 设 f [ x ] 表示把节点 x 子树内的资源点都与 x 的父节点断开的最小代价 那么转移显然: 枚举 x 的所有儿子节点 v,设 x 到父节点的边权为 w $f [ x ] = mi
阅读全文
摘要:传送门 斜率优化DP入门题 显然如果在一个位置 i 建一个仓库,且上一个仓库位置为 j 那么从 j+1到 i 的物品显然都要存在 i 仓库是最优的 设 f [ i ] 表示在第 i 个工厂建设仓库时,工厂 1 到 i 的物品都转移好的最小花费 考虑上一个仓库的位置 j 设工厂 i 离工厂 1 的
阅读全文
摘要:传送门 显然的斜率优化DP 设 f[i] 表示以 i 作为一段区间的结尾,从 1 到 i 的序列的战斗力的最大值 然后枚举上一个结尾 j 设战斗力前缀和为 sum 那么 f[i]=f[j]+A(sum[i]-sum[j])^2+B(sum[i]-sum[j])+C $f[i]= f[j]+
阅读全文
摘要:传送门 斜率优化DP入门题 首先有一个很显然的做法 设 f[i] 表示当前以第 i 个节点作为一段区间的结尾时,从 1 到 i 的最小花费 然后枚举上一个作为结尾的物品的编号为 j 那么转移就直接根据题意求就行了 设长度的前缀和为 sum,那么花费就是 $(i-j-1+sum[i]-sum[
阅读全文
摘要:传送门 看一下题意,树上DP? 然后考虑状态,设 f [ x ] [ k ] 表示在 x 的子树上花费 k 元时获得的最大价值 但是可能当前买的用于更高一层的合成,如果这样不能确定当前买的东西是否够更高一层的合成 所以多一维,设 f [ x ] [ j ] [ k ] ,x,k 意义同上,j 表示装
阅读全文
摘要:传送门 先考虑只有 01 边权的情况 显然可以DP+矩阵加速 但是现在边权不止 1 然鹅最大也只有 9 所以从这里入手,把点拆成 9 个,然后点之间的边权也就可以变成 1 了 同样的转移和矩阵加速 注意点之间的连接关系
阅读全文
摘要:传送门 容易看出是道DP 考虑一位一位填数字 设 f [ i ] [ j ] 表示填到第 i 位,在不吉利串上匹配到第 j 位时不出现不吉利数字的方案数 设 g [ i ] [ j ] 表示不吉利串匹配到第 i 位,再添加一个数字,使串匹配到第 j 位的方案数 那么方程显然为 : 注意我们不需要考虑
阅读全文
摘要:传送门 注意数据中 k <= 50,考虑从这里入手解决问题 设 f [ i ] [ j ] 表示 已经到 i 点,最多还能比最短路程多走 j 的长度而不超过限制时的方案数 处理出终点到每个点的最短路程 dis [ i ] 那么对于一条边 (a,b,c), f [ a ] [ j ] --> f [
阅读全文
摘要:传送门 观察题目数据,发现 k ≤ 8 ,可能可以从这里入手解决问题 考虑状态压缩 但是我们每次操作都会让一连串的序列改变,而序列的每个状态都是必须要知道的 很麻烦,所以考虑如何把一段区间表示地简单一些 差分,把原序列转化成差分序列,原序列亮为0,暗为1,差分时用上一个数异或下一个数 那么原数列中一
阅读全文
摘要:传送门 预处理 dis [ i ] [ j ] 表示从第 i 天到第 j 天不改变路线的最短路径 然后就可以愉快地推方程了 设 f [ i ] 表示从第一天到第 i 天的最少花费 那么 f [ j ] = min(f [ j ] , f [ i ] + dis[ i+1 ] [ j ] * (j-i
阅读全文
摘要:传送门 十分显然的DP 二分金币数量 然后对二分的金币数量跑DP求最大获利 方程: 设 f [ i ] 表示在第 i 个格子里的最大获利 f [ i ] = max( f [ j ] ) + val [ i ] (pos[ j ]+max(1,m-g) ≤ pos[ i ] && pos[ j ]+
阅读全文
摘要:传送门 DP 设 f [ i ] [ j ] [ k ] 表示已经走了 i 步,向上走了 j 步,向右走了 k 步时能拯救的最多奶牛数(j,k可以为负,表示反向) 设 g [ i ] [ j ] 表示牛向上走 i 步,向右走 j 步后有多少奶牛恰好在草堆上(同样 i , j 可负) 那么 f [ i
阅读全文