随笔分类 -  dp

摘要:嘟嘟嘟 看到最后让求一个比值,应该得往01规划上去想。令x = ∑v[i] / ∑c[i],则x * ∑c[i] = ∑v[i], ∑(v[i] - x * c[i]) = 0. 于是可以二分x(注意是实数二分),每一个点得到新的权值v[i] - mid * c[i],然后树上背包求最大值。如果最大 阅读全文
posted @ 2018-10-08 10:07 mrclr 阅读(326) 评论(0) 推荐(0)
摘要:一道NOIP2018模拟的DayT3 原本没打算做,结果Dukelv秒了(强的过分),就来看看。 状压dp。令dp[i][j]表示在状态 i ,最后选了第 j 个数是的最大分值。 所以我们枚举状态 i,在枚举最后一个选的 j,再枚举下一个要选的k,容易得出: dp[i | (1 << (k - 1) 阅读全文
posted @ 2018-10-06 19:00 mrclr 阅读(164) 评论(0) 推荐(0)
摘要:嘟嘟嘟 今天才知道,原来lcs也有O(nlogn)的做法…… 首先对于两个排列(即使不是排列,离散化一下就行),我们能很容易的得出a[i]在b中出现的位置,但是无法保证出现的相对位置和a[i]相同,所以我们要解决的是求出a[i]在b中出现的相对位置相同的最长序列长度是多少。(相对位置就是对于两个的数 阅读全文
posted @ 2018-09-24 19:26 mrclr 阅读(176) 评论(0) 推荐(0)
摘要:嘟嘟嘟 当年的我不会状压,于是就很自然的爆零了。 今年的我会了状压,于是尝试一波状压dfs。 然后怎么就AC了…… 首先,有两个数组dis[i]:i 到打通的宝藏屋经过的宝藏屋数量;dp[i] 一个二进制数,第k位为1表示第k个宝藏屋已经被开采过了。 然后就是暴力dfs啦。 首先枚举打通的宝藏屋 i 阅读全文
posted @ 2018-09-21 17:00 mrclr 阅读(548) 评论(0) 推荐(0)
摘要:嘟嘟嘟 时隔将近一年,我终于开始捡起去年NOIP的题了。记得当时啥也不会的我看到这题无从下手,就连暴力也没写出来。 好吧,说正事。 1.如果k = 0的话很好做,就是最短路计数。 2.不过这道题允许走“冤枉路”,于是我们可以dp。考虑到每走一条边,就会对冤枉路的长度做出贡献,那么令dp[i][j]表 阅读全文
posted @ 2018-09-21 15:37 mrclr 阅读(239) 评论(0) 推荐(0)
摘要:嘟嘟嘟 这应该算一道树形背包吧,虽然我还是分不太清树形背包和树形dp的区别…… 首先dp[i][u][j] 表示在u的前 i 棵子树中,留了 j 条树枝时最大的苹果数量,而且根据题目描述,这些留下的树枝一定都连在u上。 然后我们从1~j 枚举 k,于是 dp[i][u][j] = max(dp[i 阅读全文
posted @ 2018-09-14 17:06 mrclr 阅读(197) 评论(0) 推荐(0)
摘要:嘟嘟嘟 一看完题我就知道是树形dp,状态都想出来了:dp[i][j]表示以 i 为根节点的子树,选了 j 个用户时的最大利润。然后我就卡住了……直到看题解的那一刻…… 题解说:树形背包。于是我就知道为什么gg了:我总共就做了一道树形背包。 思路大概是这样的:对于一个节点u,枚举他的儿子v,然后dfs 阅读全文
posted @ 2018-09-13 20:09 mrclr 阅读(173) 评论(0) 推荐(0)
摘要:嘟嘟嘟 这好像是一种树上背包。 我们令dp[i][j] 表示在 i 所在的子树中(包括节点 i)分离出一个大小为 j 的子树最少需割多少条边。 那么转移方程就是 dp[u][j] = min(dp[u][j], dp[u][j - k] + dp[v][k] - 1) (v是u的一个儿子) 理解起来 阅读全文
posted @ 2018-09-13 17:42 mrclr 阅读(171) 评论(0) 推荐(0)
摘要:嘟嘟嘟 题说的很明白,就是求树的重心。 我们首先dfs一遍维护每一个点的子树大小,然后再dfs一遍,对于一个点u,选择子树中size[v]最小的那个和n - size[u]比较,取最大作为删除u后的答案Max[u]。 然后再O(n)遍历一遍取min(Max[i]). 写代码的时候两次dfs可以合并。 阅读全文
posted @ 2018-09-13 15:50 mrclr 阅读(178) 评论(0) 推荐(0)
摘要:嘟嘟嘟 树形dp。 首先一个很常规的想法就是如果u到v有一条边,那么建立cost(u, v) = 0, cost(v, u) = 1的两条边. 可以两遍dfs。 先任选一个点作为根节点,第一遍从下往上dfs,维护节点u到他的所有子节点的距离,很容易得出dis[u] = ∑dis[v] + cost( 阅读全文
posted @ 2018-09-13 14:43 mrclr 阅读(215) 评论(0) 推荐(0)
摘要:嘟嘟嘟 题目大意就是对于一个m面的骰子,回答这么两个问题: 1.求连续扔n次都是同一数字的期望次数。 2.求连续扔n次每一次数字都不相同的期望次数。 对于期望dp特别菜的我来说,这道题已经算是很难了。反正是抠了一天…… 我们先看第一问。 令fi表示连续 i 次数字都相同的期望,那么要考虑他能转化到什 阅读全文
posted @ 2018-09-13 13:46 mrclr 阅读(161) 评论(0) 推荐(0)
摘要:嘟嘟嘟 虽然分类是期望dp,不过好像是最水的 因为在陆地上的时间和概率是固定的,所以只用考虑过河的期望时间。 对于一条河p, l, v,p好像没什么用……不管了,首先期望时间我觉得可以这么算:期望时间=期望距离 / 速度,又因为船停的位置和方向都是等概率随机的,所以期望的距离就是平均距离,很显然最长 阅读全文
posted @ 2018-09-12 15:54 mrclr 阅读(199) 评论(0) 推荐(0)
摘要:嘟嘟嘟 这道题很显然是dp,刚开始我是设dp[i][j]表示到第 i 个时间段,申请了 j 个课程耗费的体力值的总和的最小期望值,但是想了半天也没有推出转移方程,现在想想觉得应该是无法表示他第 i 时刻在哪一个教室。 于是我们加一维dp[i][j][0/1]表示第 i 时刻我们是否申请了换教室。那么 阅读全文
posted @ 2018-09-12 14:55 mrclr 阅读(171) 评论(0) 推荐(0)
摘要:嘟嘟嘟 看这种图上摆放方案的题,以及 m <= 10,就一定能猜到是状压dp。 考虑当前第 i 行放一个3 * 2的方块,只会受到 i - 1行和 i - 2行的影响, 所以设:0:表示上两行都空闲。 1:i - 2行有块,i - 1行空闲。 2:i - 1行有块,因此 i - 2行的状态就不用管了 阅读全文
posted @ 2018-09-11 19:04 mrclr 阅读(215) 评论(0) 推荐(0)
摘要:嘟嘟嘟 看来状压dp入门题都是这个难度的。 令dp[i][j]表示到了第 i 行,状态为 j 时的方案数。 然后枚举这一行和上一行的状态,则dp[i][j] += dp[i - 1][k]。 预处理合法的种植状态。 还有,判断种植状态符不符合草地状态只能一位一位比较,因为位运算不能辨别两个数的二进制 阅读全文
posted @ 2018-09-10 20:29 mrclr 阅读(138) 评论(0) 推荐(0)
摘要:嘟嘟嘟 做完[NOI2001]炮兵阵地这道题,顿时觉得此题好水~~15分钟AC 令dp[i][j][k]表示到第 i 行放了 j 个国王,该行状态为 k 时的方案数。然后dp的时候第一层循环枚举 i,第二层 j,如果j 合法的话,再枚举第三层 i - 1行的状态 k,然后如果k合法且 j 和k不冲突 阅读全文
posted @ 2018-09-10 19:43 mrclr 阅读(154) 评论(0) 推荐(0)
摘要:嘟嘟嘟 看到 m <= 10,就知道这道题可定是状压dp。 还是一行一行dp,可见当前第 i 行能否放炮兵,除了和第 i 行的地形有关,还和 i - 1, i - 2行炮兵的放置状态有关。 因此dp要开三维,dp[k][j][i] 表示第 i 行的放置状态为 j, i - 1 行的放置状态为h时最多 阅读全文
posted @ 2018-09-10 19:12 mrclr 阅读(190) 评论(0) 推荐(0)
摘要:嘟嘟嘟 这道题感觉和昨天的凉心模拟有点像,不过这一次n和m都是手动输入的,所以矩阵自己画不出来。 但总体的思路还是一样的:状压dp,每一行为一个状态。 考虑每一个状态:对于每一个1 * 2的方块,要么横着放,要么竖着放。竖着放对于这一行相当于这一块的一半。因此,第k位为1表示第 i 行第k列有一个一 阅读全文
posted @ 2018-09-10 16:35 mrclr 阅读(155) 评论(0) 推荐(0)
摘要:嘟嘟嘟 题意概括一下,就是在无向图上求一条1到n的路径,使路径上第k + 1大的边权尽量小。 考虑dp,令dp[i][j] 表示走到节点 i,路线上有 j 条电话线免费时,路径上最贵的电缆花费最小是多少。则对于一条从u到v,长度为w的边,转移方程是: 1.这条电缆要付费:dp[v][p] = min 阅读全文
posted @ 2018-09-06 15:28 mrclr 阅读(164) 评论(0) 推荐(0)
摘要:嘟嘟嘟 这个是一个很明显的dp,遇到这种倍数的问题的,就令dp[i][j]表示选到了第 i 只牛(不是选了 i 只牛),sum(Ri) % f == j 的方案数,则, dp[i][j] = dp[i - 1][j] + dp[i - 1][(j + f - a[i] % f) % f] 等式右边第 阅读全文
posted @ 2018-09-01 08:47 mrclr 阅读(237) 评论(0) 推荐(0)