动态规划
文章平均质量分 58
_kikyou-
这个作者很懒,什么都没留下…
展开
-
CF319B Psychos in a Line (单调栈+dp)
传送门给定一个序列,如果第i个数比第i+1个数大,那么就会吃掉第i+1个数,吃与被吃同时发生,每一次吃看作一轮,问多少轮后可以稳定下来。dp[i]表示i位置被吃的时候是第几轮,(0表示不会被吃,初始记为1)对于i,我们从i-1的位置往前遍历,假设遍历到位置j,如果a[j]<=a[i],那么dp[i]=max(dp[i],dp[j]+1)否则当a[j]>a[i], 直接退出循环不需要更新此外,如果a[i]是前i个里面最大的,dp[i]=0转移过程可以用单调栈,不断原创 2021-11-09 15:44:55 · 169 阅读 · 0 评论 -
Codeforces Round #737 (Div. 2)D. Ezzat and Grid (dp+线段树)
传送门给了n个01串,每个串都是1e9的长度。一个01串集合是优美的当且仅当相邻的任意两个串中,至少存在一列,满足在这两个串里面都是1。问最少删去多少个串,才能使得剩下的串构成一个优美集合。题目等价于可以从中挑出多少个串,使得任意相邻的两个串都满足条件。我们先思考一个暴力解法:dp[i]表示前i个串中,最多可以挑出多少个串构成优美集合。求解dp[i]:先枚举串i的每一个1的位置j,然后枚举dp[k],(1<=k<=i-1),对于j位置上也是1的串k,我们取dp[i]=max(d原创 2021-11-03 23:40:01 · 151 阅读 · 0 评论 -
Educational Codeforces Round 81 E. Permutation Separation(dp+线段树优化)
传送门题意:给定一个排列p,每个位置有一个花费a[i],先可以在任意位置把p切开成头尾两部分,非空,然后从两个部分中选几个数放到另一个部分,使得左边集合的每个数都小于右边集合的最小值(某个集合为空也符合要求)。 移动第i个数花费为a[i],求最小花费。(1<=n<=2e5)我们观察发现,最终两个集合的答案只能是这样 1 2...m ; m+1,m+2..n于是,我们可以枚举分割点t(t在左边),再枚举左边集合的最大值m,[1,t]中找到大于m的元素给他们移到右边去,[t+1,n原创 2021-10-26 20:15:59 · 142 阅读 · 0 评论 -
Codeforces Round #748 (Div. 3) F. Red-Black Number (dp)
传送门给定一串长度为n的数字,可以把每一位涂上红色或黑色,要求每种颜色至少有一位,每位都必须涂色,最终红色位构成的数可以整除A,黑色位构成的数可以整除B.输出红 黑数相差最小的一种涂法,如果不存在,输出-1.本来有2^40个状态,我们需要合并某些状态以减少状态数目。这种涉及整除,且除数比较小的情况,我们可以拿模数当成一维状态。dp[pos][mod_a][mod_b][na]表示当前枚举到第pos位,红色数对A的模数为mod_a,黑色对B的模数为mod_b,总共有na个红色,状态下的涂色答案。原创 2021-10-15 10:29:52 · 249 阅读 · 0 评论 -
Codeforces Round #743 (Div. 2) C. Book (拓扑排序+dp)
传送门起初打算直接用拓扑排序模拟看书过程。每一遍都把能加的点全部加进去队列,等队列空了就重新看一遍。对于节点i,如果本轮中i的父亲节点编号都小于i,且此时i的入度已经为0,就把i加入队列。但是这个思路始终写不对,应该是假了,遂放弃。题解在拓扑排序的基础上用了dp,dp[i]表示学完第i个章节至少需要的次数。 然后从上到下一层一层地更新。dp[i]=max(dp[fa])+1 (i<fa)dp[i]=max(dp[fa]) (i>fa)对于第i个节点,我们枚举它的所有父亲节点求出次数原创 2021-09-22 20:30:42 · 227 阅读 · 0 评论 -
cf1900左右的dp
文章目录CF296BCF296B#include<bits/stdc++.h>using namespace std;//#pragma GCC optimize(2)#define ll long long#define pii pair<int,int>#define re registerconst int maxn = 1e5+10;const int mx = 40;const ll mod = 1e9+7;const ll inf = 34359.原创 2021-09-13 16:48:24 · 289 阅读 · 0 评论 -
矩阵快速幂优化dp
文章目录构造矩阵快速幂优化线性递推式POJ3734[Buses Gym - 101473H](https://vjudge.net/problem/Gym-101473H)[CF222E Decoding Genome](https://codeforces.com/problemset/problem/222/E)构造矩阵快速幂优化线性递推式遇到某些线性递推式,我们可以设法构造成矩阵乘积的形式,像斐波那契数列 f[i]=f[i-1]+f[i-2] ,写成矩阵乘积的好处就是,由于矩阵乘积具有结合原创 2021-09-11 19:55:36 · 661 阅读 · 0 评论 -
D. Kavi on Pairing Duty(dp)
传送门题意:给定正整数n,不超过1e6 。坐标轴上有2*n个点,分别在1 2 3…2n 。两个点连成线段,每种连法都可以得到n个线段。good pairing指,这个连法下的n个线段,任意两个线段要么长度相等,要么有包含关系。问一共有多少个good pairing.分析:我们令dp[i]表示n==i时题目给的样例特别良心,拿n==3来说:①只考虑最边上的1 6连起来,有一种连法,可以贡献1*dp[n-1]种连法②把1 2 5 6四个点连起来,且1 6不能连(避免和第①种重复),这样还是原创 2021-05-26 14:05:36 · 424 阅读 · 2 评论 -
Educational Codeforces Round 109 D. Armchairs (dp)
12原创 2021-05-17 13:27:15 · 417 阅读 · 0 评论 -
Contest 2050 and Codeforces Round #718 D. Explorer Space(dp)
传送门题意:给定一个n * m的网格图,可以花费一定代价移动到相邻的任意4个格子,每个格子移动代价未必相同,对于每个点,问移动k次最终回来的最小代价。无法回来则输出-1.(2<=n,m<=500,1<=k<=20)分析:首先如果k是奇数,那么一定是-1。如果k是偶数,那么我们只需要求走k/2步的最小代价即可,因为回来的路是对称的。我们容易发现,某个格子走k步的最小代价可以由周围格子的k-1步最小代价转移而来。(因为可以花1步的代价走到周围格子)所以dp[i][j][l]原创 2021-05-16 22:44:06 · 131 阅读 · 0 评论 -
Codeforces Round #577 (Div. 2) D. Treasure Hunting (贪心+dp)
题目链接题意:给定n*m的格子图 , 某些格子有宝藏 。出发点在最下角(1,1), 移动规则为:不可以向下走。只有位于某些特殊列的时候能往上走, 否则只能左右移动。数据范围是2e5 。分析:首先每一行的宝藏中,我们只需关心最左端和最右端的2个就行,取完这一行的宝藏后,停的位置要么是在最左端宝藏 记为L,要么是在最右端宝藏 记为R。要向上走的时候,L/R每种情况又有2种选择,记L右边最近的特殊列为Lr,左边最近的特殊列为Ll,停在L位置的时候,要么从Lr上去,要么从Ll上去,上去之后停的位置又有最左原创 2021-05-06 19:31:46 · 102 阅读 · 0 评论 -
Sum of Paths CodeForces - 1467D (线性dp)
题目链接题意:在一段数列上,机器人可以选任意初始点,移动k格 。定义一条路径由机器人移动的k+1位置组成,c0,c1…ck。路径的值为a[c0]+a[c1]…+a[ck] 。q次单点修改,每次改完后 ,求所有路径的值之和。分析:先不关心单点修改。每个点的最终贡献就是其被经过的次数*点值。我们只要在O(N²)时间内把每个点被经过的次数求出来就能解决这题。令dp[i][j]为走i步到达j点的方案数,同时由于路径可逆,它还表示从j点出发走i步能产生的路径数。 (两种含义综合一下i就可以作为中间点原创 2021-03-27 16:30:19 · 108 阅读 · 0 评论 -
一本通——单调队列优化dp合集 (烽火传递 最大连续和....)
题目链接朴素的dp过程不难理解,dp[i]表示:考虑前i个烽火台 且第i个点燃状态下的最小代价。dp[i]=min(dp[j])+a[i] ( i-m<=j<=i-1)j的范围:在考虑i之前,i前面的m个元素,必须取1个,比如i=7,m=3 ,考虑i=7之前,4 5 6中必须取1个。用单调队列可以优化这种类问题。所谓单调队列 ,就是 不断地向缓存数组里读入元素,也不时地去掉最老的元素,不定期的询问当前缓存数组里的最小的元素。保证每次查询区间最值时可以用O(1)时间查到。维护单原创 2020-10-07 11:08:18 · 426 阅读 · 0 评论 -
树上dp ——基环树 合集(持续更新ing)
最近在洛谷上写树上dp,遇到了一个叫基环树的东东。蒟蒻不自量力,也来写一篇合集 吧。什么是基环树?基环树,也是环套树,简单地讲就是树上在加一条边。它形如一个环,环上每个点都有一棵子树的形式。因此,对基环树的处理大部分就是对树处理和对环处理。显然,难度在于后者。一般来说,这种题目的做法都是先找到环,断开环中的任意一条边, 把它当成一般的树形DP来做。步骤一:找环,我们可以用dfs记录前驱,标记访问状态来找环,如果搜到某点已经访问过了,说明这个访问过的点以及其前驱必在环上。步骤二:断环,断开这条边原创 2020-09-20 00:26:24 · 754 阅读 · 0 评论 -
P2015 二叉苹果树 (树上背包入门)
题目链接题意: 给定一棵树,每条边有权重,问如果只保留e条边,最多能保留多大权重保留e条边,不容易分析,转化成保留e+1个点,权重放给孩子节点 问题转化成 保留包括根节点在内的e+1个节点,求最大权重和建树方式:链式前向星,建双边由此转化成树上01背包问题//dp[rt][m] 以rt为根,保留根节点在内的m个点的最优解,父节点的最优解由孩子节点递推而来,边界就是叶子节点 叶子->根每个孩子回溯时,对于以孩子节点为根的子树来说,只有选它和不选两种dp[rt][j]=max(dp[rt]原创 2020-09-18 12:34:29 · 130 阅读 · 0 评论 -
P1273 有线电视网 (树形背包入门)
题目链接题意:给定一棵树,叶子节点有价值,但每条边都有成本值,问在不亏本 ,也就是利益不为负数的情况下,最多能到达多少个叶子节点。 1<=n<=3000思路:这题隐约感觉不难,就是树上背包问题。 但是口胡了好久最后弄不出来,看别人的题解发现自己连状态都确定错了= =、错误想法:dp[rt][1/0]表示以rt为根的树,rt到达或不到达 且不亏本状态下 能取到的最多个 叶子节点数。 (写出来就能发现错得离谱QAQ正解:dp[rt][j]表示以rt为根的树,取j个叶子节点状态下的 最大利益值原创 2020-09-17 23:49:07 · 128 阅读 · 0 评论 -
消防局的设立 LibreOJ - 2559 (无权值的最小支配集)
题目链接无权值最小支配集:给定一棵树,树上任意点可以支配距离其不超过k的顶点,问最少选多少个点才能支配完所以的点。此题k==2.贪心,一次bfs记录好各节点深度,并用栈存好,显然这个栈是单调的,栈定元素层数最深。每次找最深层的节点,也就是栈顶元素,选择其父亲的父亲节点,并跟新标记。 细节见代码注释#include<iostream>#include<algorithm>#include<cstdio>#include<stdlib.h>#inc原创 2020-09-17 20:38:26 · 118 阅读 · 0 评论 -
P1131 [ZJOI2007]时态同步 (树上dp水题)
题目链接思路: 感觉这题是写过树上dp里面最水的一题了233dp[rt]表示以rt为根的树,修改所需最小值.具体过程看代码注释#include<iostream>#include<algorithm>#include<cstdio>#include<stdlib.h>#include<iostream>#include<algorithm>#include<cstdio>#include<std原创 2020-09-16 23:18:31 · 152 阅读 · 0 评论 -
[CQOI2009]叶子的染色 (树形dp+思维)
题目链接这题刚开始以为要枚举根,这样看数据估计得超时了。后来看了大佬的题解才发现并不需要orz。随便选一个非叶子节点作为根,确定了根我们开始dp设dp[rt][x]表示以rt为根的树 rt染成x色的最小染色点数(为什么不设立不染色的状态下面分析)首先看到题目要求,根到第i号叶子节点简单路径上最后一个染色点的颜色为c[i],由此我们可以初始化叶子节点 ,dp[y][c[y]]=1,dp[y][c[y]]=INF ,因为叶子节点就是路径的最后一个点,非c[i]色的状态就搞成INF,保证这个状态不能向原创 2020-09-16 13:05:08 · 326 阅读 · 0 评论 -
acwing 1078. 旅游规划(求树直径上的点)
题目链接题意:给一个树,可能直径不唯一,求所有直径上的所有的点思路:先用dp求直径,然后枚举每个直径中点,根据转移方程从中点dfs,把所有符合条件的点丢进set里面即可。#include<iostream>#include<algorithm>#include<cstdio>#include<stdlib.h>#include<iostream>#include<algorithm>#include<cstdio原创 2020-09-15 16:07:23 · 363 阅读 · 0 评论 -
#10154. 「一本通 5.2 例 2」选课(树上背包入门)
题目链接题意:给定n门课程,某些课程有1门先行课,必须先修了先行课才可以选这门课,选择m门课,每门课有学分,求可以获得的最大学分数。思路:首先建树,题目给出了0号就是虚根,所以可以直接建。1、这里用链式前向星建图2、dp[rt][m]:以rt为根的树,保留m个节点状态最优解,叶子节点就是边界,叶->根,采取dfs回溯转移,dp[0][m+1]就是答案,0是虚根所以+1转移方程:dp[i][j]=max(dp[i][j],dp[child][a]+dp[i][j-a]) 枚举每个孩子 对每个原创 2020-09-12 23:56:42 · 273 阅读 · 1 评论 -
Resource Archiver HDU - 3247 (AC自动机+最短路+状压dp/dfs 或 AC自动机+bfs暴力)
题目链接 题意:给定n个文件串,m个病毒串,问能构造多短的字符串,满足包含了全部文件串,不含病毒串。 文件串长度之和<=1e4 病毒串长度之和<=5e4 ,1<=n<=10,1<=m<=1000思路:首先把文件串,病毒串建一个AC自动机,尾节点打好状态标记。之后有2种方法:········· 第一种是AC自动机上用状压dp(1<=n<=10), 但是如果直接令dp[i][j]表示转移到第i个节点,状态为j时的最短字符串的话,1<=i&原创 2020-08-25 23:16:44 · 362 阅读 · 0 评论 -
Lost‘s revenge HDU - 3341(AC自动机+状压dp)
题意:给出n个模式串,一个目标串,问把目标串重新排位最多能产生多少个模式串,可以重叠且所有串只包含A C G T。目标串长度不超过40思路:1、问题转化成,使用与目标串相同数目的A G C T字符排列组合,得到的字符串最多能包含多少个模式串。多模式匹配问题,建好AC自动机。2、目标串长度不多,联想到可以用类似 ”乌龟棋“这题类似的状压dp,把A G C T的使用数目情况看成一种状态,Hash[i][j][k][m]表示用了i个A j个G k个C m个T时的状态Hash从0开始赋值,于是每个状态就对应了一原创 2020-08-23 20:16:57 · 123 阅读 · 0 评论 -
Ring HDU - 2296(AC自动机+dp)
题目链接题意:给你m个字符串,每个字符串有自己的价值,求一个长度不超过n的字符串,满足其包含的所有子串价值之和最大 。思路:套路有点明显,AC自动机+dpdp[i][j]表示走了i步,到达j节点时的最大价值, 则dp[i][j]=max(dp[i-1][father])+value[j]但是这题细节很多:一是关于建AC自动机时候字符串价值的预处理,二是dp过程的常数优化,三是当有多个最优解字符串的时候要求长度最小 且字典序最小的那个。 具体看代码注释了~#include<iostream&g原创 2020-08-21 17:48:13 · 171 阅读 · 0 评论 -
Wireless Password HDU - 2825(AC自动机+状压dp 卡常)
题目链接题意:给你M个word串,问你能构造多少种长度为N的字符串,满足至少包含K个不同的word串。 1<=N<=25 1<=M<=10 1<=K<=10思路:首先想到,建AC自动机,并且给每个插入的word串一个状态,1<<x x为插入的序号,即:isstr[1<<x] 就是第x个word串对应的二进制状态。(1 10 100 1000… )建好AC自动机后就是一个状态压缩dp的题,dp[i][j][k]表示目前走了i步,到原创 2020-08-21 00:24:44 · 193 阅读 · 0 评论 -
Censored! POJ - 1625(AC自动机 + dp +高精度模板)
题目链接题目大意:给你一个字母表,给定一些敏感字符串,问长度为m且不含任意敏感字符串的串有多少个。(字符全部来自字母表)思路:首先第一个坑点是输入的字符是unsigned char,可能出现负的ASCII码值,我的解决方法是整体加128。 此外,这题和POJ2778有点类似,不过POJ2778不需要用大整数,用矩阵快速幂可以过,但这题需要用高精度存答案,高精度+矩阵快速幂会tle。所以我们用动态规划,对建好的状态机进行状态转移(AC自动机建状态图的过程就不赘述了),令dp[i][j]为目前走了i步的原创 2020-08-19 19:08:48 · 180 阅读 · 0 评论