
线性dp
dp
野指针*
这个作者很懒,什么都没留下…
展开
-
牛客多校第七场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 评论 -
牛客多校第6场M(dp或者递推)
思路:首先,我们可以将整个地图看成一个棋盘,起点为白色,然后(x + y)为偶时是Alice走,否则是Bob走.然后,倒着递推,假设f[i][j]为棋子在坐标(i, j)时的胜负情况,用一个二进制数表示,从低到高为分别表示平局,A赢,B赢.我们考虑只对Alice所走的路径进行dp,由于我们要考虑Bob的所有举动,所以这些胜负情况要先取与,取完与后状态仍然为1说明无论这一步Bob怎么走,都不会影响状态,此时我们取或.最后输出起点的答案即可.代码:...原创 2022-08-07 14:41:55 · 131 阅读 · 0 评论 -
CF1716D(“按顺序“的完全背包)
题意:从坐标轴原点0出发,给定定值k,第一步走k的倍数,第二步走k+1的倍数....走的距离为正数.求对于[1, n]中的每一个坐标,有多少方案到达该坐标.思路:显然是个dp,假设为走到坐标i的方案数.考虑其转移方程.由这些坐标转移过来,但是我们不能直接写转移方程,因为这些坐标可能上一次走了k步,然后又从更新过来,这样会导致层次紊乱,算出的答案不对.其次,可能是同一个方案,可能会被计算多次.于是我们选择"分层"地设计转移方程,我们按照倍数从小到大转移方程,假设当前的倍数为k,1~k-1倍的方案数为,初始化当原创 2022-08-05 11:33:42 · 229 阅读 · 0 评论 -
[daimayuan]每日一题 国家铁路(二维前缀和 + 动态规划)
我们枚举每个方格,然后计算与每个方格最短的路径,但是暴力枚举是O(n^2)级别的,考虑枚举一个点,另外一个点在O(1)查询(因为是静态问题,不涉及修改不需要用到logn的数据结构),我们可以预处理出每个点靠左上和左下部分的最小值的点(这里的"值"是推公式推出来的),借鉴二维前缀和的方法预处理即可.具体做法如下:1.当x2 >= x1且y2 >= y1时,(x1, y1)在(x2, y2)的左上角,距离为a[x1][y1] + a[x2][y2] + c * (y2 - y1 + x2..原创 2022-05-19 14:13:56 · 271 阅读 · 0 评论 -
树状数组优化最长上升子序列和最长公共子序列
我们回忆一下用朴素的dp的解法,对于一个数a[i],我们寻找a[1~i - 1]中小于a[i]的数的最长的子序列长度更新.这里,树状数组优化同样利用了这个思路.我们假设为以值i(注意不是下标)结尾的最长上升子序列的长度,并且用树状数组维护f[x]值.由于值域很大,所以我们要先对值域进行离散化.接着,我们从前向后遍历数组a,找到小于a[i]的最大的x对应的f[x]值,并用f[x] + 1更新f[a[i]].代码如下:#include <bits/stdc++.h>using n..原创 2022-05-14 22:30:04 · 782 阅读 · 0 评论 -
AcWing 316. 减操作 (构造 + dp)
#include <bits/stdc++.h>// #define LOCAL#define INF 0x3f3f3f3f3f3f3f3f#define IOS ios::sync_with_stdio(false), cin.tie(0)// #define int long long#define debug(a) cerr << #a << "=" << a << endl;using namespa...原创 2022-03-15 00:31:59 · 232 阅读 · 0 评论 -
AcWing 315. 旅行 最长公共子序列变形(dfs+线性dp)
这道题是最长公共子序列的变形,难点在输出解决方案上:表示a序列以第i个元素结尾,b序列以第j个元素结尾的最长公共子序列长度.我自己的想法是,可以利用acwing314题的思路去输出输出方案.首先,如果s1[i] = s2[j], 那么我们就找到他们前面第一个公共的字母,如果这两个字母对应的位置a,b满足f[a, b] + 1 = f[i, j],那么这两个字母就可以将答案继承下来,以此类推,我们得到所有位置的答案后排序并离散化即可,但是这样时间复杂度过高了.接下来,我们用递归输出解...原创 2022-03-14 20:13:41 · 346 阅读 · 0 评论 -
AcWing 314. 低价购买:最长上升子序列的变形
这道题就是最长上升子序列的变形最长下降子序列,不同的是,这道题要我们求的是方案数.我们回忆一下最长上升子序列的知识点,很容易得知:其中f[i]表示以第i个元素结尾的最长子序列长度我们使用已经得知的前缀继承长度,那么我们能不能用类似的方式来继承方案数呢?我们假设C[i]是以第i个元素结尾的最长序列的方案数,有:最终的答案就是:maxl就是我们求得的最长的序列的长度.当然,题目中将价格序列一致的方案判断为相同方案,那么我们就要特判,当f[i] = f[j]且a[i]...原创 2022-03-14 18:02:11 · 263 阅读 · 0 评论