
动态规划
dp
野指针*
这个作者很懒,什么都没留下…
展开
-
兔子与数列(分治 + 记忆化搜索)
【代码】兔子与数列(分治 + 记忆化搜索)原创 2022-08-21 19:45:45 · 120 阅读 · 0 评论 -
Acwing405将他们分好队(二分图 + 背包回溯)
首先,正着解有点难,我们反过来,如果两个人不认识,说明一定不能在同一个队伍里,我们给两个点连一条边,然后处于一个点双的点是确定一个其他都确定的,我们用染色法判断是否能染成二分图即可.染完色以后,我们看到差值最小,可以用背包解决.原创 2022-08-19 23:44:09 · 119 阅读 · 0 评论 -
CF1720D2(字典树解决异或运算+dp)
考虑优化这个方程.看到这个位运算,我们比较烦的一点就是不等号,我们尝试变成等号,a_j ^ i < a_i ^ j,此时我们在二进制的情况下观察这个不等式,发现从最高位开始,将会出现第一个位置是a_j ^ i!= a_i ^ j的,由于是小于号,所以在这个位上,a_j ^ i是0,a_i ^ j是1.此时我们画个真值表看一下a_i,a_j,i,j的取值.在第k位之前呢,a_j ^ i = a_i ^ j,此时移个项,a_j ^ j = a_i ^ i.原创 2022-08-19 13:35:49 · 278 阅读 · 0 评论 -
魔改森林(dp+容斥原理)
然后这道题就做完了,注意坐标的变换,使得计算更方便.原创 2022-08-18 00:21:01 · 339 阅读 · 2 评论 -
牛客多校第9场B(前缀和与差分优化dp)
设计状态:最开始我是将f(i, j)表示为走到第i格走了j步,但是这样转移f(i, j) = ∑f(i - a(k))(j - 1) * 1 / a(k).O(n^3).这样貌似没办法优化,因为枚举的顺序取决于外层.于是我们调换顺序f(i, j)表示走了i格走到第j步,这样f(i + 1, j + 1 + ...) = f(i, j) * 1 / a(j),这样就能用前缀和加差分优化了....原创 2022-08-16 11:32:57 · 121 阅读 · 0 评论 -
牛客多校第九场I (单调栈优化dp/单调栈的常用套路)
但是一个一个一个求时间复杂度会爆炸,所以我们使用结构体存这一段内最小的min值,再存前缀最小的minf + val值,然后再存a值,然后用单调栈维护a值递减的结构体.假设这些段为[l_1, r_1], [l_2, r_2]....[l_s, r_s],那么我们改写状态方程,设计状态:f[i][j]表示1~j的塔被拆成i块的最小代价.,其中val_t表示第t段的max值..时间复杂度O(n^3)...原创 2022-08-16 00:41:24 · 268 阅读 · 0 评论 -
和与或(有点不一样的数位dp?)
注意到,每一位只能选至多一个1.加上每一位r[i]的限制,联想到数位dp.设f[pos][lim]为当前的数位为pos,lim是大小为(1原创 2022-08-13 22:27:43 · 105 阅读 · 0 评论 -
2020沈阳ICPC H(背包+双指针) I(同余方程结论)
用dp解决这道题.我们以天数作为阶段,显然这是无后效性的,然后根据题意设计f[i]为处理前i次借车花费的最少的费用.然后这就是背包了.这里转移的时候我最开始是想到二分,但是会T.于是观察到转移有单调性,然后就用双指针优化dp了....原创 2022-08-11 23:50:49 · 425 阅读 · 0 评论 -
牛客多校第七场J(线性dp)
首先,子段模k余0可以转化为sumi ≡ sumj (mod k),就是两个sum值在模意义下相等,由于模意义下sum值为0~k-1,那么我们可以确定阶段,i表示已经放完模意义下sum值为0~i-1的数,然后我们需要刚好为t的贡献,如果有x个sum在模k意义下相等,那么产生的贡献为。就表示已经放完模意义下sum值为0~i-1的数, 当前放第模意义下为i的数,已经放了j个位置,产生的贡献为k的方案数.然后就可以状态转移了.,此时我们需要知道位置的信息,还需要知道产生的贡献,于是就把这两个信息放在状态中....原创 2022-08-09 13:51:21 · 132 阅读 · 0 评论 -
CF1183H(线性dp+简单的容斥)
显然,f[i][j]表示前i个字符产生的字符串产生长度为j的子序列一共有多少种,如果所有字符都不一样,那么f[i][j] = f[i - 1][j] + f[i - 1][j - 1], 但是有相同的字符,我们考虑容斥,如果这个字符有前驱,我们要减去f[pre[i] - 1][j - 1],因为这个字符和前驱组成的字符串本质上是一样的.:给定一个长度为 n 的字符串 以及 一个数字 k,规定串的每个子序列的价值为 ,现在要求你求出 个。指的是:子序列的内容不同,而不是单纯的子序列的位置不同。...原创 2022-08-09 13:42:34 · 178 阅读 · 0 评论 -
CF366C(用差值作为状态 + 背包)
首先看到这个分式,我们想到转化成加减法,移项得val - k * w = 0,最终差值为0,于是我们将每个物品的val - k * w作为体积,设f[i][j]表示前i个物品选的差值为j的最大选择个数.做01背包即可.给你n个水果,每个水果有一个价值val,还有一个增加的卡路里w,要你求解满足。...原创 2022-08-09 13:38:23 · 282 阅读 · 0 评论