随笔分类 -  动态规划 - 线性dp

摘要:题目大意:给定一个长度为 N 的序列,开始时所有的位置都不可用,每经过一个时间单位,都会有一个位置被激活。现给定激活顺序的序列,求每次激活之后全局的最长上升子序列的长度,保证数据随机。 题解: 引理:数据随机的情况下,一个长度为 $N$ 的序列的最长上升子序列的期望长度为 $O(\sqrt n)$。 阅读全文
posted @ 2019-09-04 00:17 shellpicker 阅读(198) 评论(0) 推荐(0)
摘要:题目大意:给定一个数轴和 N 个点,点有点权,现从 0 位置出发,初始时每次只能走 d 的距离,可以在数轴上任意位置停下,此时,会得到一个点权和。现允许支付 x 的费用,使得每次可以走的距离为一个范围 [max(1,d x), d+x]。求最少支付多少费用才能使得经过的点权和至少为 k。 题解:根据 阅读全文
posted @ 2019-08-07 21:58 shellpicker 阅读(174) 评论(0) 推荐(0)
摘要:题目大意:一个人在时间 [1,N] 内工作,现有 M 个任务,每个任务需要在一段固定的时间区间内完成,任务之间的时间可能有重叠。若当前时间有任务要开始,且人处于空闲状态,则一定要这个人来做,否则这个人忽略这个任务。求用以上原则进行工作的最长休息时间是多少。 题解: 若用 f[i] 表示前 i 分钟的 阅读全文
posted @ 2019-06-27 11:42 shellpicker 阅读(454) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,现选出 M 个点组成一个集合,求这 N 个点到这个集合的最近距离的和是多少。 题解: 状态设计为 dp[i][j] 表示前 i 个点中选出 j 个点的最近距离和是多少,转移显然要枚举上一个选的点在哪里,即:$dp[i][j]=min(dp[k][j 1]+cos 阅读全文
posted @ 2019-05-30 10:38 shellpicker 阅读(440) 评论(0) 推荐(0)
摘要:题目大意:给定一个 N\ M 的矩阵,现从 N 行中选出 R 行,M 列中选出 C 列,构成一个 R\ C 子矩阵,求这个子矩阵相邻元素差的绝对值之和的最小值是多少。 题解: 发现是对行和列的组合生成,若直接暴力的话,时间复杂度为 $O({n \choose r}{m \choose c}nm)$。 阅读全文
posted @ 2019-05-09 20:57 shellpicker 阅读(240) 评论(0) 推荐(0)
摘要:A 直接模拟即可。 B 对数组中的值进行排序去重。发现若去重之后的数组中有大于 3 个数时无解,因为无法找到一个点到数轴上四个点的距离均相等。若去重之后的数组中只有三个值,则判断中间的值是否到两边的值相等,若不相等,同理无解,相等则解为距离。若只有两个不同的值,若中点是整数,则答案为中点到左端点的距 阅读全文
posted @ 2019-04-17 16:03 shellpicker 阅读(236) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,有 M 个询问,每个询问要求输出长度为 L 的上升子序列,若不存在,输出 impossible,若存在,输出下标字典序最小的一个。 题解:考虑到若 L 大于整个序列的 LIS 的长度,显然无解。反之,则一定有解。输出下标字典序最小,考虑按照下标贪心即可。 代码如 阅读全文
posted @ 2019-04-03 16:47 shellpicker 阅读(162) 评论(0) 推荐(0)
摘要:题目大意:给定 N(1 using namespace std; const int maxn=5010; int n,a[maxn],dp[maxn][maxn],ans; int main(){ scanf("%d",&n); for(int i=1;i=1&&a[j] a[i] a[i] a[ 阅读全文
posted @ 2019-03-31 19:04 shellpicker 阅读(551) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,有 M 个点对答案的贡献为 1,其余为 0,现从起点出发,每次只能走 [s,t] 个单位,求从起点走到终点时答案贡献最小是多少。 题解:由于 N 很大,无法直接记录状态。观察发现 M 很小,且 [s,t] 也很小,因此,考虑到只有在答案贡献为 1 的点的 附近 阅读全文
posted @ 2019-03-25 21:07 shellpicker 阅读(173) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,将序列划分成若干段,保证每段之和不超过 M,问所有段的最大值之和最小是多少。 题解:设 $f[i]$ 表示前 i 个数满足上述条件的最优解,显然有状态转移方程$$f[i]=min\{f[j]+max_{j+1\le k \le i}\{a[k]\}\}$$,发现 阅读全文
posted @ 2019-03-05 07:35 shellpicker 阅读(271) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,点有点权,从序列中选出恰好 X 个数,并且保证任意连续的 K 个数中均有一个被选中,求选出的点权最大是多少。 题解:此题可以作为 烽火传递+ 来处理,只不过在烽火传递的基础上加了选出恰好 X 个数,因此只需在状态维度上加上一维选出的个数即可,$dp[i][j]$ 阅读全文
posted @ 2018-12-06 00:19 shellpicker 阅读(213) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,求带权区间最小覆盖。 题解:设 $dp[i]$ 表示从左端点到 i 的最小权值是多少,则状态转移为:$dp[e[i].ed]=min\{dp[j],j\in[e[i].st 1,e[i].ed 1] \}$,初始化 $dp[st 1]=0$ 即可。因此,这里用线 阅读全文
posted @ 2018-11-30 01:26 shellpicker 阅读(418) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,求这个序列中等差数列的个数。 题解:根据题意应该是一道序列计数 dp。设 $dp[i][j]$ 表示以第 i 项结尾,公差为 j 的等差数列的个数,则状态转移方程为 $dp[i][d]=\sum\limits_{j=1}^{i 1} dp[j][d]$。由于一个 阅读全文
posted @ 2018-11-29 12:23 shellpicker 阅读(266) 评论(0) 推荐(0)
摘要:题目大意:给定一个数字三角形,求从 (1,1) 到第 N 行的路径经过的权值之和加上该路径上任意一个点的权值之和的最大值。 题解:任意加一条路径上的某个值,可以看成是 多了一次选择的权利 ,即:在每次经过一个点时,若没使用过权利,可以选择使用或者不使用,若已经使用过,则不能再使用。因此有状态 $dp 阅读全文
posted @ 2018-11-21 13:10 shellpicker 阅读(133) 评论(0) 推荐(0)
摘要:题目大意:给定一个数字三角形,求从 (1,1) 走到最后一行的路径和对 100 取余数的最大值。 题解:由于最优解涉及到取余数的操作,因此按照原先的状态设计并不符合最优子结构性质,即:两个最大数相加取模并不能得到一个最优解。因此将其转化为可行性问题,即:再开一个维度记录下每个位置可能的模值,最后取第 阅读全文
posted @ 2018-11-21 11:59 shellpicker 阅读(264) 评论(0) 推荐(0)
摘要:题目大意: 定义一个串:只含有 '( )','[ ]','{ }',3种(6个)字符。 定义 SS 串: 1. 空串是SS表达式。 2. 若A是SS表达式,且A串中不含有中括号和大括号,则(A)是SS表达式。 3. 若A是SS表达式,且A串中不含有大括号,则[A]是SS表达式。 4. 若A是SS表达 阅读全文
posted @ 2018-11-20 18:52 shellpicker 阅读(170) 评论(0) 推荐(0)
摘要:题目大意:给定两个有 N 个数的序列 A,B,每个点有一个对应的权值,现需要计算答案的贡献:$B[i] min\{A[j]+s (i j),j\in[1,i] \}$ 的最小值。 题解:由于 B 序列是固定的,因此可以考虑最优化与 B 对应项相乘的值即可。 可以划分子问题,即:用 $dp[i]$ 表 阅读全文
posted @ 2018-11-19 13:50 shellpicker 阅读(150) 评论(0) 推荐(0)
摘要:题目大意:给定一个 N 个数组成的串,可以在串中插入 M 个乘号,求乘积最大是多少。N using namespace std; const int maxn=50; struct node{ int t[110],len; node(){this clear();}//构造函数需要初始化 void 阅读全文
posted @ 2018-11-16 17:26 shellpicker 阅读(279) 评论(0) 推荐(0)
摘要:题目大意:给定一个有 N 个正整数的序列,从其中拿走一些数,使得剩下的数满足严格单峰性,即先严格递增后严格递减,允许单调增和单调减,求最少需要拿走多少数。 题解:先考虑严格单调的情况,最少需要拿走多少数字意味着最多需要留下多少数字,使得这些留下的数字保持单调性,显然这是一个 LIS 问题。 那么,对 阅读全文
posted @ 2018-11-15 21:43 shellpicker 阅读(277) 评论(0) 推荐(0)
摘要:题目大意:给定一个有 N 个数的序列,求其最长下降子序列的长度,并求出有多少种不同的最长下降子序列。(子序列各项数值相同视为同一种) update at 2019.4.3 题解:求最长下降子序列本身并不难,是一道非常经典的线性dp问题,关键在于dp计数部分。这道题跟一般的状态转移计数不同,这里并不是 阅读全文
posted @ 2018-11-15 18:34 shellpicker 阅读(258) 评论(0) 推荐(0)