随笔分类 - dp
摘要:嘟嘟嘟 虽然题面很长,但是静下心来看完后,还是掩盖不了这是一道水体的事实。 发现这是一棵完全二叉树,而且深度只有40。 那么dp[u][l][r]表示到达节点u,有 l 条公路,r条铁路没修。转移方程就是分两种情况递归下去就行啦。 然后中间节点只是用来记录答案的,在叶节点计算。 据说这道题卡空间,但
阅读全文
摘要:嘟嘟嘟 这道题可以说是[HNOI2003]消防局的设立的升级版。距离从2改为了d。 辛亏d只有20,这也就是一个切入点。 令f[u][j]表示u四周 j - 1的距离需要被覆盖,g[u][j]表示u可以像四周覆盖 j 的距离。 考虑转移方程,令v为u的其中一个儿子: 1.f[u][j]:直接从v延伸
阅读全文
摘要:嘟嘟嘟 树形dp水题啦。 刚开始以为和[SDOI2006]保安站岗这道题一样,然后交上去WA了。 仔细想想还是有区别的,一个是能看到相邻点,一个是能看到相邻边。对于第一个,可以(u, v)两个点都不放,然而对于这道题就不行了。 不过dp方程更简单:dp[u][0/1]表示u这个点不放/放士兵的最优答
阅读全文
摘要:嘟嘟嘟 n个点n条边,说明图中存在一个简单环,更准确的说是每一个连通块中存在一个简单环(因为图可能不连通)。 然后有人给这个玩意起了个名字:基环外向树。 然而并没有什么用。 思路很简单:断环为链,就变成了一棵树了。为了防止断开的两端(x, y)同时被选,从x和y分别树形dp一下,然后硬性规定根节点不
阅读全文
摘要:嘟嘟嘟 01分数规划+树形背包。 然后就没了。 结果我调了半天,原因还是树形背包不熟练。 我是用dfs序求的,转化的时候,是dp[i][j]转化到dp[i + 1][j + 1]或dp[i +siz[pos[i]]][j],而不是像普通的dp从别的状态转化到dp[i][j],所以最后的答案应该考虑到
阅读全文
摘要:嘟嘟嘟 一看就是树形dp。 刚开始我的状态dp[i][0 / 1]表示以 i 为根的子树,i 选 / 不选时的最小的经费。然后转移方程我就推不出来了,因为无法很好的表示 i 和子树的关系。比如如果 i 不选,那么 i 的子节点可以选一个也可以选多个也可以一个不选,因为 i 的儿子的儿子选了的话,i
阅读全文
摘要:通向自由的钥匙被放n个房间里,这n个房间由n-1条走廊连接。但是每个房间里都有特别的保护魔法,在它的作用下,我无法通过这个房间,也无法取得其中的钥匙。虽然我可以通过消耗能量来破坏房间里的魔法,但是我的能量是有限的。那么,如果我最先站在1号房间(1号房间的保护魔法依然是有效的,也就是,如果不耗费能量,
阅读全文
摘要:我虽然做了好几道树形背包的题,但是一直不是十分理解,对于每一道题,总是看题解就明白,然后换一道题自己写不出来。临近NOIP,gg让我们强化一下背包以及树形背包,我也恰有此打算,于是又开始从头学习了树形背包。 看了好多博客以及论文之后,对树形背包确实有了一个全新的认识,尤其是这篇博客以及徐持恒的论文《
阅读全文
摘要:嘟嘟嘟 我真不信这题在洛谷上是一道黄题,起码绿题也行啊…… dp方程不难,dp[i][j]表示前 i 位用了 j 个乘号时的答案。然后转移方程我竟然没想出来(菜的过分)……其实就是枚举第 j 个乘号在哪儿,然后转移方程就是dp[i][j] = max(dp[i][j], dp[k][j] * num
阅读全文
摘要:嘟嘟嘟 这虽然是一道水题,然而我Debug了快一个点儿,于是决定在A了之后发篇博客。 这显然是一个有依赖性的背包问题,但是因为这道题一个主件最多只有两个附件,所以只有4种情况: 1.只选主件 2.主件+附件1 3.主件+附件2 4.主件+附件1+附件2 (5.都不选) 而且这四种情况是互斥的,那么这
阅读全文
摘要:嘟嘟嘟 一道人人皆知的dp基础题。我听人讲了无数遍,就是没写。 问题可以转化为找到两条从(1, 1)到(n, m)不相交的路径,使路径上的好感度之和最大。 这道题的关键在于dp的顺序,观察会发现,只要保持这两条路径枚举到同一条对角线上,顺序就对了。于是令dp[k][i][j]表示到第k条对角线,靠右
阅读全文
摘要:嘟嘟嘟 一道说难也难说简单也简单的dp题。 我觉得我的(有篇题解)做法就属于特别简单的。 平时遇到环的问题都是断环为链,但这道题给了一种新的思路。 观察一下,最后的答案无非就这两种:xxx--xx xxxx xxx xx 对于第二种,有一个特别好的做法:正着求一遍最大子串和,再倒着求一遍,然后枚举断
阅读全文
摘要:题面好难找:嘟嘟嘟 贪心 + dp。 首先要按bi的降序排序,让每一次减少大的数尽量靠前。为啥咧?于是我们就需要证明:令sum = a1 - (1 - 1) * b1 + a2 - (2 - 1) * b2 + a3 - (3 - 1) * b3 + ……+ an - (n - 1) * bn,整理
阅读全文
摘要:嘟嘟嘟 考虑dp。 对于ai,和他能匹配的bj只有9个,所以我们考虑从这9个状态转移。 对于ai 能匹配的一个bj,当前最大的匹配数一定是[1, j - 1]中的最大匹配数 + 1。然后用树状数组维护前缀匹配数最大值就行了。 1 #include<cstdio> 2 #include<iostrea
阅读全文
摘要:嘟嘟嘟 刚开始我以为是kmp+dp,后来发现其实没那么复杂。 令dp[i][j][h][0/1]表示A串到第 i 位,B串到第 j 位,其中A串取了k个子串时,Ai 取/不取的方案数。那么转移方程就很容易的写出来了: dp[i][j][h][0] = dp[i - 1][j][h][0] + dp[
阅读全文
摘要:嘟嘟嘟 这题刚开始是什么思路也没有,关键是不知道怎么解决序列反转的问题。 然后我就想到如果暴力反转一个序列的话,实际上就是不断交换数组中的两个数ai和aj,同时要满足交换的数不能交叉。 然后又看了一眼(岂止一眼)题解,因为ai <= 50,所以令dp[i][j][L][R]表示区间[i, j],mi
阅读全文
摘要:嘟嘟嘟 中序遍历有一个特点:序列[1, n]是一个中序遍历,i 是根节点,则[1, i - 1]是他的左子树的中序遍历,[i + 1, n]为右子树的中序遍历。所以就想到了区间dp,对于[i, j]枚举根节点k,则dp[i][j] = max(dp[i][k - 1] * dp[k + 1][j]
阅读全文
摘要:嘟嘟嘟 一道树形dp题。 令dp[u]表示以u为根时所有点的深度之和。考虑u到他的一个子节点v时答案的变化,v子树以外的点的深度都加1,v子树以内的点的深度都减1,所以dp[v] = dp[u] + (n - siz[v]) - siz[v]。于是dp式就搞出来了。 所以两边dfs,第一遍求siz和
阅读全文
摘要:嘟嘟嘟 偶然看到的这道题,觉得有点意思,就做了。 首先题里说修改后的数列只能出现修改前的数,那么状态之间的转移也就之可能在这些数之间。 令f[i][j]表示第 i 个数改成原序列第 j 小的数时的最小步数。容易得出:f[i][j] = min(f[i - 1][k]) + abs(a[i] - b[
阅读全文
摘要:嘟嘟嘟 令dp[i]表示在n个人中,有 i 个人获得第一名的方案数,转移方程为dp[i] = C(i, n) * dp[n - i]。C(i, n)就是从n个人中选 i 个第一,那么剩下的n - i 个人必须都不是第一,所以就从dp[n - i]转移过来。 因为模数不是质数,所以O(n2)杨辉三角递
阅读全文

浙公网安备 33010602011771号