动态规划
文章平均质量分 51
涉及动态规划入门知识,进阶知识,种类繁多,内容详实
秦三码
石油大学
展开
-
斜率优化之李超线段树
三对于斜率优化,分为三种类型,一是斜率单调,第二种是是斜率不单调可以二分,第三种便是毫无规律可言的斜率情况,采用李超线段树可以在log范围内快速查询与修改,且能够胜任全部情况,代码与时间复杂度都很优秀。f为计算函数值函数 i是离散化之后的x坐标,c[i]为该离散化坐标,t为直线编号,x[t]为其固定斜率,y[t]为其固定截距。李超线段树k维护的是当前x轴区域线段编号,l,r为离散化之后x坐标的范围,s[k]是当前x的最优决策线段。然后朝着使新直线更优的一侧进行递归,直到到达一个点时,再次比对函数值即可。原创 2022-11-13 21:46:27 · 490 阅读 · 0 评论 -
E - Swap
E-SwapTimeLimit1024MBScore。原创 2022-08-02 12:02:56 · 96 阅读 · 0 评论 -
CF1703G Good Key, Bad Key
Good Key, Bad Key - 洛谷G. Good Key, Bad Keytime limit per test3 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputThere are nn chests. The ii-th chest contains aiai coins. You need to open all nn chests in order from chest 11原创 2022-08-01 14:47:41 · 219 阅读 · 0 评论 -
Simple Operations on Sequence
TimeLimit1024MBScore。原创 2022-07-28 20:14:19 · 99 阅读 · 0 评论 -
决策单调性详解
决策单调性充要条件对于两个决策点 ,若在i处,大决策点优于小决策点,则在[i+1,n]处,大决策点都比小决策点优证明时,无需数学证明,打表证明cost数组是“凸”即可j<j+1<=i<i+1 证明cost数组交叉小于包含-------------------------------------------------------------------------------------------------------------------------------.转载 2022-05-21 14:45:13 · 1640 阅读 · 2 评论 -
斜率优化最详解析
[HNOI2008]玩具装箱 - 洛谷首先用dp[i]表示前i个装进容器时所需的最小花费,可以得出的是,本次的i可以单独放进一个,可以和i-1,i-2...1放进一个,也就是dp[i]= dp[j] + (sum[i]-sum[j] + j-i-1-L)^2 本次长度的费用 其中sum[i]-sum[j]表示j+1--i之间的C值,也就是说j的取值范围为1<=j<i。令A[i]等于 sum[i]-i令B[i]等于 sum[j]-j+1+Ldp[i]= dp[j] + (sum原创 2022-05-17 17:03:35 · 170 阅读 · 1 评论 -
P7642 [BalticOI 2006 Day 2] JUMP THE BOARD【普及+提高】 高精度DP
[BalticOI 2006 Day 2] JUMP THE BOARD! - 洛谷没太多思维难度,数据很小,答案很大,直接高精度模拟即可。难度应该是黄题#include<iostream>#include<cstring>#include<cstdio># define mod 998244353using namespace std;typedef long long int ll;string s[110][110];int a原创 2022-04-10 22:03:50 · 368 阅读 · 0 评论 -
P7623 [AHOI2021初中组] 收衣服-递推DP
[AHOI2021初中组] 收衣服 - 洛谷本题我们后推前设推到位置i,那么【1..i-1]其实已经按顺序排列好了。由于是全排列,我们本次要寻找的数字i,可能的位置有n-i种,我们枚举这n-i+1种位置,对于每一个位置,剩下的数字也是全排列,所以每一个位置就代表了 factor[n-i] 种情况,一旦我们对某个位置这样做了,那么我们排序代价之和就是w[i][j]*factor[n-i]。但是,这仅仅是这一个位置,这一个数的排序代价。每一个位置排序之后,还需要剩下的n-i个数进行排序,故考虑承接前n.原创 2022-04-10 20:31:24 · 382 阅读 · 1 评论 -
P7381 [COCI2018-2019#6] Sličice[普及+提高】DP
[COCI2018-2019#6] Sličice - 洛谷难度应该是评错了,而且题干样例解释也不对,应该是一道黄题。设dp[i][j]为前i个选择j时的最大值,本次可以一个不选也可以选择j个,注意别超越m的界限即可#include<iostream>#include<cstring>#include<cstdio># define mod 1000000007using namespace std;typedef long long int ll原创 2022-04-10 19:46:25 · 403 阅读 · 0 评论 -
(详解)矩阵快速幂详解与常见转移矩阵的构造
目录转移矩阵求解套路常见转移矩阵1-斐波那契矩阵承接套路常见转移矩阵2-类斐波那契数列常见转移矩阵3-幂常数---------------------------------------------------------------------------------------------------------------------------------网上大部分讲解都是停留在快速幂的模板和求解斐波那契数列上,但矩阵快速幂的应用远不及此,且难点在于转移矩阵的构造原创 2022-04-10 18:50:43 · 1484 阅读 · 3 评论 -
P3558 [POI2013]BAJ-Bytecomputer
[POI2013]BAJ-Bytecomputer - 洛谷易知变动之后每个位置无非还是0,-1,1假如一个位置有比1更大的,那么它前面势必是一个1,而我们只需要不下降即可,本位置变成更大的势必会导致以后也产生更大的假如一个位置有比-1更小的,那么前面势必是一个-1,而我们要求不下降,很显然不符合题意这样我们设定dp[i][0],[1][2]分别代表本位置变成-1,0,1时的情况,本位置时-1时,可以变成-1,0,1,但很显然变成0是不可能的,其余以此类推即可。由于我们严格按照不下降来完原创 2022-04-09 23:20:17 · 354 阅读 · 0 评论 -
P3052 [USACO12MAR]Cows in a Skyscraper G-二进制状压DP
状压DP特点是数据范围极小,在20以内。一般这样的题目可以通过暴力搜索与剪枝通过,但更优的方法莫过于状压DP。n种物体选与不选共有(1<<n)种方案,方案下界为0,上界为(1<<n)-1,也就是都选。状压DP一般是前推后且无后效性。对于每一个位置,都要遍历0-(1<<n)全部状态,对于每一个状态,再枚举各个物体选与否的情况,已经选了就略过,否则前推后进行优化。注意物体的元素下标最好从0开始,便于二进制表示。dp[i][j]代表了开i个背包时,装下j状态时的情况原创 2022-04-08 16:03:09 · 834 阅读 · 0 评论 -
P2401 不等数列
不等数列 - 洛谷那1 <3 <4 2< 5 为例 ,插入数字6时,能使小于号增加1或者不增加,其中增加1的方法在于把6放在末尾,与大于号位置,共有两个,不增加时,放在头部,与小于号位置即可。‘也就是说dp[i][j]由两种状态转移,一种是借助上一数字,dp[i-1][j],我们将本个数字插入头部1种,插入小于号位置,j种。即 dp[i][j]=(dp[i][j]+dp[i-1][j]*(j+1))%mod;另一种是,插入尾部或者大于号位置, dp[i][j]=(dp.原创 2022-04-07 22:09:03 · 344 阅读 · 0 评论 -
四边形不等式优化区间DP的方便记忆
[NOI1995] 石子合并 - 洛谷整个CSDN上关于四边形不等式的应用全在本题,整个洛谷关于四边形不等式的题目也就两道,本题是其中之一。其他各大算法书上,要么直接略过dp这一部分,要么有关于四边形不等式的几行论述。 所以,与其证复杂的大小关系,不如打表出规律。第一,四边形不等式适用于dp[i][j]=min{dp[i][k]+dp[k+1][j]+cost[i][j]} 的区间DP,可以求出最小值与最大值的方案,简记为“合并石子”第二,四边形不等式成立条件 ,简记为“二凸一单”cost[..原创 2022-04-07 19:35:31 · 349 阅读 · 0 评论 -
P2233 [HNOI2002]公交车路线-矩阵快速幂
[HNOI2002]公交车路线 - 洛谷矩阵乘法是指两个矩阵s1,s2.s1的行数等于s2的列数时。将第一个矩阵的第i行的每个元素分别乘上第二个矩阵第j列的每个元素然后进项相加,得到的结果就为新矩阵的第i行第j列的元素。(1,1)代表的就是 第一个矩阵第一行每个元素a1,j乘上对应第二个矩阵的bj1所得结果的和。矩阵快速幂指的是,对于同一个矩阵,反复进行矩阵乘法时的优化,方法同快速幂。初始化一个res数组代表最终结果,注意的是,矩阵快速幂里面的初始的1指的是res[i][i]都等于1。矩阵快原创 2022-04-06 19:29:23 · 406 阅读 · 0 评论 -
P2112 鸿雁传书-DP
鸿雁传书 - 洛谷牵扯到一些数论技巧,如果每转移一次状态计算一次方差是很不方便的。设最终每段xi个字母,最终的方差s=1/k( (x1-av)^2+(x2-av)^2+...(xk-av)^2)对于总数一定的全部字母,分成k段,每段平均值av是定值,又因为k也是定值,所以我们dp[i][j]直接代表前i个单词分成j段时,“ ( (x1-av)^2+(x2-av)^2+...(xk-av)^2 ”这一部分的最小和即可。对于一个i,j向前推若干个表示第j行算进去的单词,由dp[t][j-1]原创 2022-04-06 15:39:54 · 304 阅读 · 0 评论 -
P1052 [NOIP2005 提高组] 过河-【普及+提高】窗口滑动与路径压缩,裴蜀定理
网上题解百分之八十是错误的,新加了hack数据。2520的压缩法存在漏洞。本题采用裴蜀定理将会拥有更快的时间复杂度与精确度;裴蜀定理讲的是 对于一个,x,y 其gcd(x,y)一定能够通过a,b ax+by=gcd(x,y)的形式来表示我们对于一个s,t。取s与s+1来看,其gcd一定是1。本题不用数学证明,直观感知一下 as+b(s+1)=w w==s(s+1)时 ,a=0,b=s,此后,w每增加1,我们只需要b+1即可,也就是说,距离一点距离大于等于s(s+1)的点,是一定能够到达的。.原创 2022-04-06 00:02:28 · 696 阅读 · 0 评论 -
P1687 机器人小Q-分类讨论DP
机器人小Q - 洛谷dp[i][j][1]代表前i个能量选取j个能量时,最少天数dp[i][j][0]代表前i个能量选取j个能量,最少天数对应的最后一天的时长。由于本题天数是随着时间而推移的,不能把现在的某个能量填补进前几天的“空缺”,故只能通过填补上一天的空闲或者另开一天来实现状态转移。首先不选时,考虑继承 dp[i][j][1]=dp[i-1][j][1]; dp[i][j][0]=dp[i-1][j][0];选的时候需要另开一天,当然就是dp[原创 2022-04-05 16:08:02 · 192 阅读 · 0 评论 -
P1310 [NOIP2011 普及组] 表达式的值【普及+提高】中缀与后缀表达式,DP,栈
手写的表达式叫做中缀表达式,但计算机无法直接计算,需要利用栈或者模拟栈来将中缀表达式转化为后缀表达式,再对后缀表达式进行栈底到栈顶遍历实现求值也就是说,求中缀表达式的值,共有两大部,第一步,需要转化为后缀表达式,第二步,后缀表达式的求值第一步,中转后设定模拟栈s1,符号栈s2对于中缀表达式每一个元素1.数字入模拟栈s12左括号入符号栈s23右括号弹出符号栈s2,入模拟栈s1,直到栈顶为左括号,且左括号弹出,左右括号不入模拟栈s1与符号栈s24运算符4.1符号栈空,压入符号原创 2022-04-04 23:25:03 · 785 阅读 · 0 评论 -
P1651 塔-【普及+提高】DP数组的平移与二维跳跃
塔 - 洛谷设dp[i][j]为前i个木块拼成了两座塔,左边减去右边差值为j时,左边塔的最高高度。先忽略正负与空间问题,第i块木块,可以放也可以不放,不放就要承接前i-1块差值为j的状态,放的话,可以放在右边,使得差值为j+a[i]的变成j,也可以放在左边,使得差值j-a[i]的变成j.但我们发现,存在差值为负的情况,所以我们动用了数组平移。设置500000为差值为0点,-500000为差值负向最大点,500000为差值正向最大点另外,本次状态只受前一状态影响,连续开辟50*500000的数组一原创 2022-04-04 17:36:53 · 381 阅读 · 0 评论 -
P2432 zxbsmk爱查错[普及+提高】DP
对于每一个位置pos,枚举字符串,考虑向前推移,若推移位置与pos之间包含了该字符串,就可以在包含了该字符串的上一个位置基础上进行状态转移,代价是删除的数。最初时,应该赋值为dp[i-1]+1,代表全部被删。#include <iostream>#include <string.h>#include <algorithm>#include <cstdio>#include <stdlib.h>#include <string&原创 2022-04-04 15:04:47 · 320 阅读 · 1 评论 -
P3983 赛斯石(赛后强化版)[普及+提高】双重完全背包
赛斯石(赛后强化版) - 洛谷我们发现,如果没有船的租价时,直接完全背包就可以了,但是本题选择两个物体时,分船运输和合船运输价格是不一样的。因此我们完全可以先把船装满,装哪些货物,对船的租价没有任何影响,因此可以对船进行完全背包,再对需求来一次完全背包即可。注意开long long#include <iostream>#include <string.h>#include <algorithm>#include <cstdio>#incl原创 2022-04-02 09:27:56 · 321 阅读 · 0 评论 -
P2359 三素数数-【普及+提高】DP
三素数数 - 洛谷设dp[i][j][k]为第i位为j,上一位是k的方案数,我们枚举j,k,枚举k的上一位l,当且仅当j*100+k*10+l是三位素数时,可以状态转移,dp[i][j][k]+=dp[i-1][k][l],宏定义模数,防止超时。初始话一位为1,二位也为1.#include <iostream>#include <string.h>#include <algorithm>#include <cstdio>#include &.原创 2022-04-02 08:53:05 · 146 阅读 · 0 评论 -
P2308 添加括号-【普及+提高】区间DP与递归括号树
添加括号 - 洛谷仔细读题很容易发现本题第二问其实就是“合并石子”那题,在枚举断点时,其实就是枚举了加号的位置,在合并区间时,其实就是在两个小区间中间放一个加号,在两个小区间外侧放两个括号即可。突破点在加号的位置。第一问的输出利用递归和对区间合并的理解大区间[1,n]来说,由两个次区间合并,我们输出时,先按照固定格式输出( + ),在区间合并时,我们已经确定了加号位置,所以[1,pos]又是一个区间,[ pos+1,n]又是一个区间。当left==right-1时,是两个数中间一个加号的情况原创 2022-03-31 14:34:20 · 149 阅读 · 0 评论 -
P2380 狗哥采矿【普及+提高】棋盘DP
狗哥采矿 - 洛谷所谓棋盘dp就是dp[i][j]代表了(1,1)到(i,j)范围内的收益,在矩阵前缀时,利用了一些容斥原理达到状态转移的目的。本题为了维护矩阵形状,考虑到每个点其实只能一直向上或者一直向下,只需要dp[i-1][j]加上左边前缀和与dp[i][j-1]加上上部前缀和即可。唯一让我疑惑的是,本次i,j的连接方式和其内部的1连接方式根本不同时,为什么不会产生影响呢?首先看边界,最上面一定全部向左时,dp[1][j]才能最大值,最左侧全部向上时dp[i][1]才能取最大值。由于.原创 2022-03-30 21:41:52 · 314 阅读 · 0 评论 -
P2132 小Z的队伍排列-杨氏矩阵与hook定理
小Z的队伍排列 - 洛谷一个数比其右侧全部,下面全部数小,则称该数阵为杨氏矩阵;每个位置的格子,向右向下扩展的格子总数+1(包含了本身)成为这个格子的hook,那么无论排列方式,图形如何,总方案数是总格子数的阶乘除以全部钩子数的乘积。#include <iostream># include<algorithm>using namespace std;typedef unsigned long long int ll;ll hook[50][50];ll h[原创 2022-03-30 09:33:32 · 385 阅读 · 0 评论 -
P1725 琪露诺-单调队列优化DP
琪露诺 - 洛谷最先能到达的是l位置,对于每一个新遍历到的位置,我们向单调队列加入dp[i-l],在对head进行范围约束,这样我们就得到了在[i-r,i-l]范围内的最大值,更新dp[i]即可最后输出的时候需要再可能到达n的区间#include <iostream># include<algorithm>using namespace std;typedef long long int ll;int dp[200000+10];int q1[200000+原创 2022-03-29 20:33:01 · 522 阅读 · 0 评论 -
P1650 田忌赛马[普及+提高】DP
田忌赛马 - 洛谷首先对大王的进行从高到低排序,也顺便对田忌进行排序。如果田忌头部马能够战胜本局大王马,那么就出队,否则选择最末尾的马,那么每局也就有两种情况,选择末尾马,选择头部马。dp[i][j]代表第i轮时,田忌前面出了j匹马。他可以本轮出第j匹马,也可以i-1轮出到j匹马,本轮出第min(n,n-(i-j)+1)的马。【因为为了凑够i匹,必须从最后选出剩余的】第一轮时, dp[1][1] dp[1][0](最后一匹马)分别处理第二轮 dp[2][1] 依靠dp[1][1]与d...原创 2022-03-29 20:09:49 · 623 阅读 · 0 评论 -
P1622 释放囚犯-区间DP
释放囚犯 - 洛谷释放第一个囚犯的过程就是把整个区间分成两个子区间的过程,代价是两边人数和。而对于新形成的两个子区间,又可以按照类似方法实现划分。那么完全可以把整个过程倒过来,通过小区间合并来形成最终大区间即可。预处理出来m个人分出来的m+1个区间,这些区间并不包含释放的人,我们枚举断点的时候还要算上断点之外,区间之外的人,也就是大区间拆分时还没释放的人;#include <iostream># include<algorithm>using namespa原创 2022-03-29 19:04:19 · 291 阅读 · 0 评论 -
P1717 钓鱼[普及+提高】DP
题目列表 - 洛谷设置dp[i][j]为走到i号鱼塘耗费j分钟能钓到的最多鱼数目,本次可以钓0,1,2...次,对应转移为上一位置钓j-t[i-1]-time时的鱼数#include <iostream>using namespace std;typedef long long int ll;int dp[1000][5000];int f[1000],d[1000],t[1000];int main(){int n;cin>>n;i原创 2022-03-29 14:52:11 · 191 阅读 · 0 评论 -
P2760 科技庄园【普及+提高】单调队列优化的多重背包
科技庄园 - 洛谷单调队列优化的速度比二进制优化还要高如果对单调队列优化的多重背包不太熟悉,可参考博文单调队列优化多重背包(全网最详细解析)_秦三马和他的CF生涯的博客-CSDN博客首先,原点到一个位置的时间与能量消耗是相同的,都是二倍的(i+j),那我们完全就可以把其看做背包物体的体积,那么背包总体积是多少呢,显然是时间与能量-1的最大值,题目要求能量不能为0,所以我们只能使用总能量-1的能量。注意一些细节即可,例如前后两个矩阵可能并不一一对应,也就是桃树不为零时,次数可能为0,我原创 2022-03-29 10:01:40 · 304 阅读 · 1 评论 -
P1279 字串距离-【普及+提高】DP
字串距离 - 洛谷dp[i][j],代表a串i位置与b串j位置匹配的结果,可以i,j匹配,由dp[i-1][j-1]转移,可以i-1,j匹配,i位置匹配空格,可以i,j-1匹配,j位置匹配空格。 注意需要预处理出来头部和另一串全部位置的匹配情况,dp[0][i]=i*k,也就是全部用空格与子串进行匹配。# include<iostream>#include<cstdio>#include<cstring># include<malloc.h>原创 2022-03-28 23:04:21 · 272 阅读 · 0 评论 -
P1026 [NOIP2001 提高组] 统计单词个数-字符串处理与DP
[NOIP2001 提高组] 统计单词个数 - 洛谷难点在于一个字母不能再用,this在不划分时,若单词为 this th his is1-4有this(th),his,is也就是三个,可以倒着推 4有0个,34有1个,234有2个,1234有三个,也就是倒着推推到一个新位置时,只要这个位置包含了一个新的字符串,那么数量加一即可,且只能加1,用了一个就不能用,这样我们就处理出来了,i--j字符串的个数,且互不影响,相互独立;所谓倒着推,就是说,dp[i][j] 由dp[i-1][j]推来,固原创 2022-03-28 10:30:50 · 275 阅读 · 0 评论 -
洛谷--橙色百道DP总结
最近刷完了洛谷橙色DP大约一百道,算是发现了一些套路,就部分题目做一些总结。大概分为三类第一类,九大背包及其衍生第二类,经典DP模型,如LCS,LIS等第三类,实际问题背景的普通,环形,树上DP,多维DP;第一类找啊找啊找GF - 洛谷不同于普通单维费用背包,本题费用有两维,要求价值最高且另一维费用最少,则当能够提升价值时,就转移费用,否则取费用最小值即可[USACO06JAN]Dollar Dayz S - 洛谷完全背包求方案数,__int128的输出积木城堡 - ..原创 2022-03-26 23:26:54 · 1199 阅读 · 0 评论 -
P1122 最大子树和-树上DP之最大子树和
最大子树和 - 洛谷dp[i]代表以i为根节点的子树种美丽值最大值,对于其连接的每个子树,可以进行连接,也可以不连接(删掉边)最终输出最大值即可#include<cstdio>#include<cmath>#include<iostream># include<algorithm># include<cstring>using namespace std;typedef long long int ll;typedef st原创 2022-03-26 16:40:14 · 441 阅读 · 0 评论 -
宏定义模数的强大优越性
在大量取模运算中,宏定义下的模数相比手动定义的模数,能大大提高代码运行速度这是宏定义下的取模运算这是一般的快乐三四倍有余!!原创 2022-03-25 17:14:09 · 410 阅读 · 0 评论 -
P7822 「RdOI R3」学习算法-连续性限定DP
「RdOI R3」学习算法 - 洛谷我们定义dp[i][j]为第i个位置放置第j个数的方案数当我们遍历到位置i时,如果i<=a[j],那么我们的状态转移方程完全可以直接由上一个位置转移过来dp[i][j]+=dp[i-1][k] 1<=k<=m当i>a[j]时,就必须考虑连续性问题了 i==a[j]+1时,我们加上前一位全部状态时,其实也包含进去了1~a[j]位置全是j的情况,这种情况个数为1,所以减去1i==a[j]+2时, 我们加上前一位全部情况时,会有破坏连原创 2022-03-25 17:10:17 · 352 阅读 · 0 评论 -
P7074 [CSP-J2020] 方格取数-三方向方格取数DP
[CSP-J2020] 方格取数 - 洛谷常规的方格取数无非是只有两个方向,规定只能向右下走;但本题规定有三个方向,一般来说dfs有四个方向和八个方向,因此本题最好还是借助DP来解。我们先对图形旋转九十度,这样,我们就只能向下与向左右走。题目还有一个细节,那就是不能返回到之前的路。首先来看往下走这个操作,要想返回原来的,只能朝上,正好我们不能朝上,所以满足题意。再看左右走这个操作。只要我们下到下一行,我们面临两个选择,一直向左一直向右,这也就代表了,如果一个点当前方向是朝着左,那么他一定是由它上面,原创 2022-03-24 20:20:40 · 630 阅读 · 0 评论 -
P2016 战略游戏-树上DP之最小点集覆盖
题目链接战略游戏 - 洛谷题目背景Bob 喜欢玩电脑游戏,特别是战略游戏。但是他经常无法找到快速玩过游戏的办法。现在他有个问题。题目描述他要建立一个古城堡,城堡中的路形成一棵无根树。他要在这棵树的结点上放置最少数目的士兵,使得这些士兵能了望到所有的路。注意,某个士兵在一个结点上时,与该结点相连的所有边将都可以被了望到。请你编一程序,给定一树,帮 Bob 计算出他需要放置最少的士兵。输入格式第一行一个整数nn,表示树中结点的数目。第二行至第n+1n+1行,每行描述每个...原创 2022-03-24 19:15:32 · 3267 阅读 · 0 评论 -
P6771 [USACO05MAR]Space Elevator 太空电梯-贪心与DP
题目链接[USACO05MAR]Space Elevator 太空电梯 - 洛谷题目描述奶牛们要去太空了!它们打算用方块建造一座太空电梯。现在它们有NN种方块,第ii种方块有一个特定的高度h_ihi,一定的数量c_ici。为了防止宇宙射线破坏方块,第ii种方块的任何部分不能超过高度a_iai。请用这些方块堆出最高的太空电梯。输入格式第一行,一个整数NN;第二行到N+1N+1行,第i+1i+1行三个整数h_i,a_i,c_ihi,ai,ci,数字之...原创 2022-03-24 16:41:56 · 210 阅读 · 0 评论