随笔分类 -  动态规划——线型

摘要:DP模型 形如$f(i)=\max \{f(j)+w(i,j)\}\quad(1\le j 阅读全文
posted @ 2019-10-06 20:16 AD_shl 阅读(315) 评论(0) 推荐(0)
摘要:Description "【SCOI2010】股票交易" 在T天时间内,第$i$天股票购入价为$ap_i$,出售价为$bp_i$,每天最多购入$as_i$股,最多出售$bs_i$股 任意时刻手中的股票数不能超过$Maxp$,且两次交易至少间隔$W$天 最大化收益,初始资金视为无限大 Solution 阅读全文
posted @ 2019-10-02 20:05 AD_shl 阅读(257) 评论(0) 推荐(0)
摘要:Description 【NOIP2012】开车旅行 (题面太长不想描述……) Solution 由于题目很复杂,所以我们将这道题分成三个部分分析 主要思路:dp+倍增+链表+离散化 Step1:预处理出这两个人从每一个城市出发的下一个城市 将这一步的答案记为$ga[i],gb[i]$ 城市高度差= 阅读全文
posted @ 2019-09-30 21:16 AD_shl 阅读(361) 评论(0) 推荐(0)
摘要:Description 【洛谷P2034】选择数字 给定一个序列,选择其中若干个数,但不能有超过k个连续的数字被选择。最大化选出的数字之和。 Solution dp+单调队列 正难则反,考虑从序列中取出一些数,这些数两两之间的距离不超过k,最小化之和 那么定义$f[i]$表示前i个数,取出一些的最小 阅读全文
posted @ 2019-09-14 21:28 AD_shl 阅读(299) 评论(0) 推荐(0)
摘要:Description 给定$n$, $m$,求十进制$n$位数每个位数之积等于k的方案数 Solution dp+高精+数学 考虑$k=0$的情况,由于可以有若干个$0$,所以方案数为$\sum\limits_{i=1}^{n}{n\choose m}\times 9^{n-i}$ 考虑另外的情况 阅读全文
posted @ 2019-08-31 06:43 AD_shl 阅读(182) 评论(0) 推荐(0)
摘要:Description 【CF1197D】Yet Another Subarray Problem 给定一个序列和m,k,求出一个子序列使得$\sum\limits_{i=l}^{r}{a_i}-k\times \lceil \frac{r-l+1}{m}\rceil$最大 特别地,一个长度为0的子 阅读全文
posted @ 2019-08-23 15:48 AD_shl 阅读(289) 评论(0) 推荐(0)
摘要:Description 给定一个整数序列,每次操作可以将某一个元素的值+1或-1,求最少需要多少次操作可以使得序列每个元素的乘积等于1 Solution dp 一些数的乘积等于1,那么说明序列中一定只含有1或者是-1,而且-1出现的次数必须为偶数 那么我们定义$f[i][1/0]$表示前$i$个数, 阅读全文
posted @ 2019-08-21 23:11 AD_shl 阅读(296) 评论(0) 推荐(0)
摘要:Description 给定若干个区间,每个区间的权值是该区间包含整数的个数,选出任意个不相交的区间使得权值和最大 Solution dp+二分查找 定义状态$f[i]$表示前$i$个区间的最大值是多少 那么我们可以将区间排序后二分找到离当前区间最近的区间 我们的决策有两种: 如果能找到上述区间,那 阅读全文
posted @ 2019-08-20 12:13 AD_shl 阅读(384) 评论(0) 推荐(0)
摘要:Description 给定一个01矩阵,求出最大的正方形子矩阵和最大长方形子矩阵,并保证取出的矩阵中的元素都为0/1 Solution 为了使题目变成上述表述的形式,我们首先将读入的矩阵的部分元素xor1,使其变成一般形式 之后,这道题变成了两道题的合体:洛谷P2701巨大的牛棚与P4147玉蟾宫 阅读全文
posted @ 2019-07-06 15:27 AD_shl 阅读(304) 评论(0) 推荐(0)
摘要:Description 给定一个棋盘, 在棋盘上放入m个炮,使得炮两两之间不能攻击,求出方案数。 Solution 考虑设计一个dp,定义f[i][j][k]表示前i行、有j列放了一个炮、有k列放了两个炮的方案数。 有一个显然的结论:如果方案合法,那么任何一行(列)的炮的数量最多为2。 然后我们思考 阅读全文
posted @ 2019-07-06 14:29 AD_shl 阅读(226) 评论(0) 推荐(0)
摘要:这道题实质上是求序列的最长不下降子序列 按照题意,我们要求出最小的代价,也就是说我们要让尽可能大的代价不动,也就是求出最长不下降子序列,之后用序列的和减去它即可。 阅读全文
posted @ 2019-06-24 21:27 AD_shl 阅读(149) 评论(0) 推荐(0)
摘要:一道不怎么简单的dp题 我们定义状态f[i][j][k][val](其中val∈{0,1})表示A串的前i个字符,分成k段,与B串的前j个字符匹配,并且A[i]选/不选的方案数。 那么我们考虑状态的转移, 当a[i]==b[j]时,f[i][j][k][1]可以从f[i-1][j-1][k-1][0 阅读全文
posted @ 2019-06-24 19:53 AD_shl 阅读(210) 评论(0) 推荐(0)
摘要:dfs+dp 我们要在一个大矩阵中选出一个小矩阵使得小矩阵的分值最小 所以我们先用dfs枚举选哪些行,再在dfs选的行的基础上对列进行dp,最后更新答案即可。 具体地,我们先通过dfs枚举r行,然后计算两个数组:sum[i][j]表示在当前dfs确定的行的状态下,第i列和第j列相邻时产生的分值。s[ 阅读全文
posted @ 2019-06-15 21:12 AD_shl 阅读(539) 评论(0) 推荐(0)
摘要:本人是NOIP2017的亲历者,两年前这道题我在考场上随便打了个二分暴力,就草草结束了 如今在做这道题,便能简单的AC了 我采用的思路是二分答案,然后用dp判断答案的可行性。定义f[i]表示到i这个格子最大的分数,如果为一个极小值则可以认为这个点无法到达;x[i]表示i的位置,g表示当前二分的答案。 阅读全文
posted @ 2019-06-08 15:38 AD_shl 阅读(677) 评论(0) 推荐(0)
摘要:单调队列优化dp 我们将每个人的s值排序,这样我们就能保证当前这个人刷的木板一定在上一个人之后,我们就能进行线型dp 定义f[i][j]表示前i个人刷前j个木板获得的最多报仇,那么有 在dp过程中,我们假定外层变量i为定值,当j增大时,不难发现k的取值范围上界不变,下界变大。我们不妨比较一下两个决策 阅读全文
posted @ 2019-06-07 20:42 AD_shl 阅读(193) 评论(0) 推荐(0)
摘要:我们定义f[i][j]表示前j个数组成的长度为i的合法序列的个数,那么有 因此我们不难写出朴素dp的代码 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using nam 阅读全文
posted @ 2019-06-07 15:25 AD_shl 阅读(230) 评论(0) 推荐(0)
摘要:线型dp+线段树优化 我们定义f[i]表示覆盖[L,i]的最小代价,我们将牛按照r递增排列,假设当前牛为[ai,bi],代价为vali 那么存在 我们在状态转移时,每次需要查询区间内的最值,同时f数组发生更新,因此我们可以用线段树的查询、修改在较快时间内维护f数组。 同时我们注意一下边界的处理即可。 阅读全文
posted @ 2019-06-06 23:44 AD_shl 阅读(343) 评论(0) 推荐(0)
摘要:一道线型dp的题目 每一种卡片有一定的数量限制,也就是说在计算到某一个状态时应当知道每一个卡片能不能用,所以我们定义状态f[i][j][k][l]表示第一种卡片用i张,第二张卡片用j张……所得到的最大值。 对于每一个状态,考虑他是怎样转移的。若当前状态为f[i][j][k][l],那么当前的状态可以 阅读全文
posted @ 2019-04-18 10:05 AD_shl 阅读(186) 评论(0) 推荐(0)
摘要:关于环形dp的处理,我采用的办法是,把整个问题分成两个问题。 首先我们简化一下问题,假设这个问题不是环形的,那么我们定义f[i][j][1]表示前i个小时休息了j小时,且第i小时正在休息,获得的体力最大值。定义f[i][j][0]表示前i个小时休息了j小时,且第i小时不在休息,获得的体力最大值。显然 阅读全文
posted @ 2019-04-13 14:16 AD_shl 阅读(422) 评论(0) 推荐(0)
摘要:关于多重背包的一道题。 首先看数据便知道朴素的多重背包无法通过,所以我们采用二进制拆分进行优化,(二进制优化点这里),这样就能顺利通过本题了。 这道题只是判断可行性,所以“价值”这一状态并没有什么用。 1 #include <iostream> 2 #include <cstdio> 3 #incl 阅读全文
posted @ 2019-04-06 13:53 AD_shl 阅读(264) 评论(0) 推荐(0)