![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
Zolrk
这个作者很懒,什么都没留下…
展开
-
P2473 [SCOI2008]奖励关 - 期望(神奇的倒推) - 状态压缩
大力模拟各种情况k * n 的模拟出每次可能抛什么出来设f[k][s] 为前k个物品状态为s时得分最大值但是有问题啊,比如 113 和 133,状态都是f[3][101],难道我还要多开一维存下不同情况?,不行吧?还是说取最大的?,这相当于后面选择的物品,对前面的状态强行选择了一下,但是并不是说113比133大,我就舍弃133,我舍弃133就相当于,走到这一步,后面直接都不走了,如果说我们...原创 2018-09-30 15:04:59 · 326 阅读 · 0 评论 -
洛谷P2014 选课 - 树上背包
注意在dp中x!=0那一段 其实是对状态的修正#include <algorithm>#include <iostream>#include <cstdio>using namespace std;const int MAXN = 300 + 10;int n,m,tot,head[MAXN],k[MAXN],son[MAXN],f[MAXN][M...原创 2018-08-13 17:38:25 · 243 阅读 · 0 评论 -
最长上升子序列 nlogn
fi 表示i长度的上升子序列的最小末尾元素值 用贪心的办法,每次访问一个小于当前末尾值的元素,就往前二分地找一个可以替换的位置#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>using namespace std;#define deb...原创 2018-08-13 14:40:31 · 464 阅读 · 2 评论 -
绿豆蛙的归宿 - 期望DP
概率正着来,期望倒着推 设f(i)表示由i到n的期望路径,设u->v有一条边,则fu += (fv + w)/出边 答案为f1 为什么w不用算到fv里面呢,考虑从fv出发到n,那么fv最后概率为1 注意dfs的时候,不能重复走一个点,但是可以重复采集一个点的信息 特别注意,由于是倒推#include <algorithm>#include <iostream&...原创 2018-08-08 17:37:31 · 178 阅读 · 0 评论 -
洛谷P1095 守望者的逃离 - 决策混乱分开处理
虽然这题显然可以DP。。。但是不能直接当背包来处理,因为没有所谓的上界 但是只拿部分分也是可以背包来做的 好吧先说正解,首先应该分析题有什么性质再DP,如果说确实找不到性质那就DP吧… 但是这题…闪烁,跑步互相独立,假设最优解有闪烁,休息,跑步这几种操作,那么可以先把闪烁和休息提前进行,跑步最后再进行,这样的话可能存在一个时间,使得只闪烁或休息不如来一点跑步了 如果硬要用背包做。。。有很多...原创 2018-08-08 15:02:21 · 295 阅读 · 0 评论 -
SCOI2005 互不侵犯 - 状压DP
考虑如何划分阶段,如何确定决策及转移 阶段就是子问题的规模,对于这道题,可以说“更小的棋盘,更少的king”算是子问题,但是我们难以表示“更小的棋盘”,难道要表示出行列吗? 我们可以灵活变换状态,更小的棋盘,并不代表我非要按相似比缩小棋盘,如果仅仅是“更小”,只要满足更小的要求,完全可以设计一个小的更加特殊的状态:按行来划分阶段,棋盘宽不变,小的仅仅是行,这样也满足“更小”的约定。虽然我没...原创 2018-08-08 10:35:56 · 265 阅读 · 0 评论 -
洛谷P1156 垃圾陷阱
可以先把dp状态设出来 再考虑其代表了什么 若一个状态不大好做 就改变设计的状态 改变其代表的东西 dp i j 表示第i个物品血量为j/高度为j 时的 最大高度/最大血量 发现最大血量不好做 可以写最大高度 这样也方便判断是否满足血量条件#include &lt;algorithm&gt;#include &lt;iostream&gt;#include &lt;cstring&gt...原创 2018-08-12 17:01:42 · 245 阅读 · 0 评论 -
洛谷P1220 关路灯 - 区间DP
说是区间DP还不如说是以区间为状态的DP 考虑问题进行的过程中有什么单调连续重叠的东西 会发现黑掉的灯连在一起且每次行动黑掉一个 考虑到老张的位置对转移有影响,结合数据范围可知这不只是二维DP暴力30分做法…dfs求全排列,为什么不用next_permutation呢。。。因为那样不能剪枝只有20分。。。#include <algorithm>#include <i...原创 2018-08-14 16:45:16 · 296 阅读 · 0 评论 -
洛谷P1119 灾后重建 - Floyed
对floyed的过程仔细分析,发现其实是一个以“除去起点和终点,中间经过的点编号的最大值”为阶段的DP 由于这道题保证了从0~N-1城市是依次修建完成的,可以说在i城市修建完成之前,i后面的城市都不可经过,又因为询问的t是递增的,所以每次的询问可看作对不同阶段的最短路查询,按照阶段来floyed就可以了,注意判-1#include <algorithm>#include &...原创 2018-07-28 13:02:15 · 225 阅读 · 0 评论 -
关于DP状态的一点小思考
最长不下降子序列,最大子段和 状态的定义都是以i为结尾的最优解 我思考了很久,是如何想到以i为结尾来定义状态的,是由什么理由才这么做的。。。 有时候设计成“前i个” 有时候设计成“第i个为结尾” 怎么设计出来的。。。 想了很久,无功而返 例如最长公共子序列,就是设计成前i个 后来再仔细想想,状态的设计,和“这一阶段状态受上一阶段什么影响有关” 设计状态也要考虑到阶段间的联系,要考虑...原创 2018-07-20 21:15:13 · 257 阅读 · 0 评论 -
洛谷P1439 最长公共子序列 - hash - dp - 贪心
因为是两串排列,所以两串值相同位置不同 那么公共子序列要求的就是值相同,而“子序列”要求的是值的位置上升 那么把ab串联系起来,b和a相同的值,位置不同。 设fbifbifb_i 为值为bi的数在a串中的位置,显然已经满足相同 那么只要取出一个最长子序列即可,若f值上升,则位置递增,则说明这些bi在a中可以构成一个子序列#include <algorithm>#inclu...原创 2018-08-13 20:58:17 · 454 阅读 · 0 评论 -
洛谷P2858 [USACO06FEB] 奶牛零食 Treats for the Cows - 区间DP
其实不是典型的区间DP。。。顶多拿区间当状态 这题的状态可能有点难想,但是可以想象到在问题过程中有个东西在单调变化(而且“重叠”,“可转移”)那么由DP的定义可以知道这就是我们要的状态了:区间 设flr表示糖果目前剩下l ~ r区间没被拿走,然后反着进行过程,把糖果一个个放回去,最后放满#include <algorithm>#include <iostream>...原创 2018-08-20 20:11:12 · 194 阅读 · 0 评论 -
P2918 [USACO08NOV]买干草Buying Hay - 完全背包
枚举上界还是好确定的,至多买h + 5000磅干草,因为一捆干草至多重5000磅#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>using namespace std;#define debug(x) cerr << #x &l...原创 2018-10-08 08:46:12 · 335 阅读 · 0 评论 -
P1273 有线电视网 - 树上背包
树上背包看作分组背包就好了,收益临时变成负数也是可以的,并且收益的数值也很大,所以不再让收益当下标,放到数组里保存,设f[x][t]表示以x为根的子树中选择t个人观看节目,电视台的最大收益(让你求什么反而不一定要存在数组里面,可能是设为数组下标再判断可行性)这题比较特殊,一般分组背包是过不了这么大数据的,但是因为实际有效的叶子节点十分少,所以可以优化(看注释)另外注意f数组初始值的设定#in...原创 2018-10-04 21:14:54 · 161 阅读 · 0 评论 -
P2577 [ZJOI2005]午餐 - 贪心 - dp
首先考虑只放一队的情况,显然是吃饭时间长的优先打饭,然而我没这么想直接套了国王游戏的模型,事实上还是从别的角度多想想比较好然后是dp,这道题怎么安排人到不同的窗口很难说,所以考虑用最暴力的状态和转移(反正数据范围小)设f[i][j][k]表示安排了前i人,第一个窗口的打饭总时间为j,第二个窗口打饭总时间为k,最优集合时间是多少然后决策一下每个人在哪打饭,并且注意一下答案的更新但是会爆内存,...原创 2018-10-04 07:59:35 · 181 阅读 · 0 评论 -
P1108 低价购买 - DP - 基于dp数组求方案
首先求一遍最长下降子序列然后考虑到方案会重复,而避免重复是件挺难的事,不妨先考虑不管重复求方案那么如何求方案呢,设pl(i)表示以i为结尾的最长下降子序列方案数,因为表示的是最长的序列,所以只有在i前面,比i大,最长序列长度还恰好比i小1的可以方案转移到i上然后删掉那些重复的,但是重复的实在难以判断,但是仔细想想也许不必删除,只需要消除某些点的影响就好了我们在统计方案的时候,是一个转移,但...原创 2018-09-20 15:41:58 · 209 阅读 · 0 评论 -
P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper - 状压
似乎状压也可以有阶段?看做广义的线性dp,这道题是以“组数”为阶段,对比互不侵犯,那题是以行为阶段。 这类题有个特点,每个阶段不是一个单纯的数,而是一行,一列,一个待填充的东西 而我们状压,一次填充一个阶段(在同一个阶段中有多个元素进行了转移),再进行下一个阶段,就又成了“线性问题”阶段应该是最外层循环这题可以看出来阶段是电梯数(想象最优解方案是先坐满一个电梯,剩下的再坐别的电梯),电...原创 2018-09-14 17:34:42 · 223 阅读 · 0 评论 -
Noip 2016 换教室 - 期望DP
期望反映了一个随机变量的平均结果,是所有可能结果的概率乘上结果的和。例如对于一个随机变量x,1/3几率变为1,1/3几率变为2,1/3几率变为3,则x的期望值为 13∗1+13∗2+13∗3=213∗1+13∗2+13∗3=2\frac{1}{3}*1+\frac{1}{3}*2+\frac{1}{3}*3=2期望具有线性性质,我们可以根据加法原理和乘法原理来对期望进行计算可以发现,最终...原创 2017-11-02 11:12:43 · 265 阅读 · 0 评论 -
BZOJ2763 飞行路线 - 分层图 - 最短路
我们把原图复制出k层,而题中给的k次免费机会,就是连接不同层次图的道路,并且遍权为0。 使用免费机票的时候,就跳到上面那一层,并且没有任何花费。 这样求一遍最短路就可以得到使用免费机票次数小于等于k的最短路 也可以从dp的角度理解: dp[v][i] = min(dp[v][i], dp[u][i] + c) 同层图转移 dp[v][i+1] = min(dp[u][i], dp[v]...原创 2018-03-14 19:23:58 · 381 阅读 · 1 评论 -
P2051 中国象棋 - DP - 包含了一些dp时常见的小错误
可以三进制状压,写个进制转换函数,可以存在整数型数组里,然后预处理一下,跟二进制没啥差别。。。 但是难写,数据范围也不够一个化繁为简的思维方式我们不需要知道棋盘具体的状态,准确来说,对于“同构”的棋盘状态(虽然同构不是这个意思,但是我找不到别的形容词了。。。),可以用一个棋盘状态去代替,只要这个状态所对应的值是所有“同构”的方案之和,就可以等效替代比如说目前有三种棋盘状态,但是可以忽...原创 2018-09-16 13:26:19 · 190 阅读 · 0 评论 -
P1441 砝码称重 - 搜索+dp
你会发现 对于这种很像背包的DP。。。不打滚动数组很有可能错,因为很多时候可能会忘记保留以前状态的答案,体现在f[i][j] = max(f[i-1][j], f[i][j]);上,因为f[i][j]可能被f[i][b[i]]更新,所以要取max,若想不取max,则必须保证这个状态只会被更新一次 这题刷表比填表更好写,刷表你的初始化只需要让f[0] = 1 然后用目前的0去更新其他状态 总结...原创 2018-09-09 16:44:01 · 189 阅读 · 0 评论 -
P1373 小a和uim之大逃离 - DP - 同余
抽象出数学表达,题意求的是使k1≡k2mod(k+1)k1≡k2mod(k+1)k1 ≡ k2 \mod (k+1) 成立的方案数 注意模数是k+1啊,都说了k+1时算作0,k+2时算作1了 其实是数学题。。。 那么k1≡k2mod(k+1)k1≡k2mod(k+1)k1 ≡ k2 \mod (k+1) 其实是比较难求的,除非记录状态,那就要多开一维,思考一下,同余还是可以移项的,现在就是求...原创 2018-09-04 21:30:34 · 182 阅读 · 0 评论 -
做DP题的一些总结(自用,勿看,如果你没做过这些题,会影响做题质量)
1.统计单词个数 https://www.luogu.org/problemnew/show/P1026 DP的过程实际上就是拼凑最优解的过程,因此,可以先想想最优方案是如何构成的,然后对最优方案进行优美地分解,使得其可以转移,(分解可以是一行一列一段一层(树上)!),比如这题我一开始状态设对了。。。但是因为太弱,没能想出来一段一段转移,而是考虑一个一个字符转移。看来做不出时就要拓展思路,拓展...原创 2018-08-20 20:49:01 · 1684 阅读 · 0 评论 -
USACO15JAN 洛谷P3116 Meeting time - 搜索 - 剪枝
数据太弱???加个剪枝就过了??? PS:wa了无数遍后,我发现自己的dfs写错了。。。。。 正解是DP。。。回来我会填坑的 原因看注释吧#include &amp;amp;lt;algorithm&amp;amp;gt;#include &amp;amp;lt;iostream&amp;amp;gt;#include &amp;amp;lt;cstring&amp;amp;gt;#include原创 2018-07-25 13:17:47 · 166 阅读 · 0 评论 -
POJ1821 Fence - 单调队列DP
#include <algorithm>#include <iostream>#include <cstdio>#include <queue>#include <deque>using namespace std;#define debug(x) cerr << #x << "="原创 2018-06-27 21:04:19 · 139 阅读 · 0 评论 -
POJ3171 Cleaning shifts - DP - 数据结构优化
#include <algorithm>#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define debug(x) cerr << #x << "=" << x <&原创 2018-06-30 11:19:32 · 209 阅读 · 0 评论 -
POJ3666 Making the Grade & Codeforces 713C
题目大意 给定一个序列,可以变化其中的数字,总代价为|A1 - B1| + |A2 - B2| + … + |AN - BN| 求最少的代价,使这个序列变为单调不严格上升或下降序列#include <cstdio>#include <iostream>#include <algorithm>#define Abs(a) ((a)>0?(a):-(a)) using namespac原创 2017-09-28 16:53:21 · 298 阅读 · 0 评论 -
Codeforces 274B 【树形DP】
题目大意 给定一棵树,以及树上每个点的权值,每次操作可以将一棵(必须)含有节点1必须包含的子树上所有的点全部加1或减1,求最少几次操作可以将树上全部节点权值变为0原创 2017-09-27 20:49:38 · 685 阅读 · 0 评论 -
Poj3661 Usaco2008JanSilver Running
题目大意 奶牛们想要变成更强的运动员,所以Bessie开始了一项N分钟的训练,在每分钟,她可以选择跑步或者休息1整分钟 Bessie所能奔跑的极限距离,取决于她的“疲劳值”,一个一开始是0的值。当她选择在第i分钟奔跑时,她将会跑DiD_i 米,并且她的疲劳值将会增加1,但是这个值不能超过M。如果她选择休息,她的疲劳值将会每分钟减少1点。她直到疲劳值减少到0的时候才能再次开始奔跑。 N分钟的锻炼原创 2017-09-10 19:32:02 · 281 阅读 · 0 评论 -
Noip2016 愤怒的小鸟 【状压DP】
考虑到n的最多只有18个,可以用二进制来表示状态:f(s)表示消灭s集合的小猪所需要的最小小鸟数量,用0为第i个只猪没有被消灭,1为第i只小猪被消灭了,就像010001010101这样的,最后求的就是111111111111111这样状态的值状态转移方程为 f(S|P[i])=min(f(S|P[i]),f(S)+1)f(S|P[i])=min(f(S|P[i]),f(S)+1)通过枚举原创 2017-09-23 08:11:45 · 325 阅读 · 0 评论 -
金明的预算方案【动态规划】
有依赖的01背包问题方便起见,我们把状态只定义在主件上(对输入进行特殊处理)每个主件有0,1,2个附件每次购买时,有**五种选择**1.不买2.只买主件3.买主件和一号附件4.买主件和二号附件5.买主件和全部附件原创 2017-07-11 12:43:44 · 1182 阅读 · 0 评论 -
Noip2015 子串 【动态规划】
这道题思维量是可以的=。= 学习了dalao们的状态设计,觉得自己还是差很多啊! 先说一个没有滚动数组的版本 对于A串的一个字符,只有选和不选两种可能,选是一种方案,不选也是一种方案设f(i,j,k)f(i,j,k) 为A串的前 i 项在分离出 第k个子串时成功匹配到B串的前 j 项时 选择 A串第i项的方案数还需要加上A串第i项不选择的方案 设s(i,j,k)s(i,j,k) 为A串的原创 2017-08-19 22:43:13 · 479 阅读 · 1 评论 -
石子归并2
环的处理方法 输入是4 4 5 9 那么我们把数组开成两倍大,在数组中存储 4 4 5 9 4 4 5 这样就可以构建一个环原创 2017-07-24 10:46:17 · 355 阅读 · 0 评论 -
乌龟棋 【多维DP】 Codevs1068
设dp[i1][i2][i3][i4] 是使用了i1张1,i2张2,i3张3,i4张4后能得到的最大分数 需要注意dp[0][0][0][0]要设置为第一个格子的分数,不然会错 下面的代码中因为i1 i2 i3 i4一开始都是0 所以x+=t可以初始化dp[0][0][0][0]为第一个格子的分数#include <cstdio>#include <algorithm>int n, m, m原创 2017-07-23 09:04:13 · 372 阅读 · 0 评论 -
石子归并 【区间DP】 Codevs1048
关于区间DP,推荐先看看最优矩阵链乘 用a[n]表示从1到n的全部石子重量 用f(i,j)表示从i到j合并所需的最小代价 从状态的角度来思考,考虑最后一次归并后的状态是如何转移的原创 2017-07-19 13:05:02 · 306 阅读 · 0 评论 -
能量项链 NOIP2006 Codevs1154
#include <cstdio>#include <algorithm>#include <cstring>int n,e,a[300],f[210][210],ans;inline void read(int &x) { x = 0; char c = getchar(); while(c < '0' || c > '9') c = getchar();原创 2017-07-21 09:27:29 · 396 阅读 · 0 评论 -
Tyvj 1072 LCIS - DP
这个题需要把LIS和LCS合二为一首先设f(i,j)表示从A1~Ai 和 B1~Bj 两段区间中,以Bj结尾的LCIS最大长度注意,这里相当于固定住了“Bj是什么”这个问题,并且状态和转移是对于每一个固定的Bj才有意义的再具体一点,因为关于A1~Ai的循环是套在B1~Bj外面的,所以在进行B1~Bj的循环时,可以将Ai看作一个常量,这个时候对答案有影响的参数就只有i,j和Bj,状态就可以设计出来。原创 2017-10-09 20:32:40 · 302 阅读 · 0 评论 -
Noip 2005 过河 - DP - 离散化
#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>using namespace std;#define debug(x) cerr << #x << "=" << x << endl;const int MAXN = 10000000 + 10;const int INF = 1<<30原创 2017-11-06 20:06:12 · 282 阅读 · 0 评论 -
从编辑距离问题中看到字符串DP的一些小细节
我RE了好几次,后来才发现我在DP部分时,是为了”string的下标从0开始,因而我DP循环也要从0到n-1“(这是错误的想法) 这样会数组越界,因为递推DP一定有一个i-1,那么如果i从0开始,就会访问负下标,导致RE 所以DP的循环变量无论如何都应该从1开始,访问字符串时i-1就是了,不能为了访问字符串方便导致出bug#include <iostream>#include...原创 2018-05-26 19:25:52 · 205 阅读 · 0 评论 -
NOI2001 炮兵阵地 - 状压DP
状压DP往往有套路,问题划分为阶段,并且阶段不是“一个”,而是“一群”,在上一个阶段到下一个阶段时,会增加一堆数据而不是一个,然后这一堆数据可以压缩成一个二进制,表示哪些有哪些没有 阶段的划分要“整齐”,比如这题是一行一行来的,维度的设计要考虑影响关系,因此设f[i][j][k]表示阶段进行到第i行(前i行)最后一行状态为k,最后一行的上一行状态为j的最优解 另一个套路就是预处理,几乎状态题都...原创 2018-05-12 10:50:40 · 330 阅读 · 0 评论