随笔分类 - DP
摘要:"题目" DP,及DP的优化。 这个题显然是一个DP,状态也比较好定义, 定义dp[i]表示双方总共取i个数时,所得到的最大差值。 然后可以得出状态转移方程,即 $dp[i]=max(data[j] dp[j 1]);j define N 1010010 define int long long u
阅读全文
摘要:分组背包 分组背包其实就是通过更改和增加枚举顺序来把01背包中的状态(第i个j重量时的最大价值转化为第i组j重量时的最大价值)。 但是要注意的就是枚举顺序一定要正确
阅读全文
摘要:最长上升子序列 最长上升子序列是DP的入门题目,解法多样,只介绍$nlog_n$的做法。 其实nlogn的做法不是传统的DP而是贪心。 定理:如果当前已选子序列的最后一位ans[last]有更合适的选择,则该选择a[i]满足$ans[last 1] using namespace std; int
阅读全文
摘要:"题目" 一道做法多种多样的题,DP做法的状态也很多。 我用$dp[i]$表示在第i秒发车的时间和,然后dp方程就很好写了 $dp[i] = dp[j] + i车的等待时间$j属于i 2m ~ i m。 然后i车的等待时间可以用前缀和来优化求出,虽然很慢,但是足以通过这道题了。 c++ includ
阅读全文
摘要:"题目" 如果暴力的话,时间复杂度是$rcC(n, n/2)^2$,主要考察搜索枚举行和列,并没有用到DP的思想。 考虑优化的话,发现枚举行或列中至少需要一步,因为这个题只能预处理优化,如果都不枚举,就相当于盲人摸象,无法预处理来优化。 因此要搜索枚举行或列,然后预处理并在列或行上跑DP,这样就可以
阅读全文
摘要:"题目" 最短路+DP 最短路可以用floyd或者spfa来处理出1到n的所有时间区间的最短路。 $dis[i][j][k][l]$表示i到j在$k,l$时间内每个时间点都能走的节点的$i,j$之间的最短路。 因此我们可以预处理出来最短路,然后开始DP,设置$dp[i]$为1到i之间的所有时间的最短
阅读全文
摘要:"题目" 不看数据范围的话是一个很简单的DP,可是加上数据范围之后就之前的做法就不行了。 所以我们考虑一下路径压缩。 小数据Code c++ include include include using namespace std; int l, m, s, t, dp[100010]; int fl
阅读全文
摘要:"题目" 该题目标签是DP,但是其实数据范围可以用记忆化搜索来解决,并且代码实现起来会简单一些,用二分查找来优化。 c++ include using namespace std; int n, k, minn = 2147483647, dp[101000]; multimap m; struct
阅读全文
摘要:"题目" 一道经典的树形dp,其树形DP的原理是递归求解树状结构,并返回已经确立的状态值,形式多为记忆化搜索形式。而树形DP也常常跟其他DP联系起来,这道题就是将树形DP和背包DP联系起来的一道题。 而且该题是01背包,所以要注意$i,j$的枚举顺序。还要注意j和k的取值范围。 $Code$ c++
阅读全文
摘要:"题目" 一道比较好想的树形$DP$ 完全可以用树形DP的基本思路,递归,然后取最优的方法。 $Code$ c++ include include include include using namespace std; int n, a, b, cnt, maxn, data[100100], d
阅读全文
摘要:"题目" 此题是一个状态转移方程还算比较多的一个区间DP,这个题也能启示我们如果某个状态不能够很好地解决问题,那么不妨试试再加一维,而且如果转移顺序不确定的话,可以试试记忆化搜索,说不定就可以比较容易的写出状态转移方程和状态转移。 状态 如果我们要关掉$i$到$j$的灯,则最后一个关掉的灯就是$i$
阅读全文
摘要:"题目" 这个题可以说是一个很基础偏中等的$DP$了,很像$NOIpD1T2$的难度,所以这个题是很好想的。 简化题意 可以先简化一下题意,这个题由于从上面向下调和从下向上爬都是一样的,所以我们就可以轻松的想到暴力的方法。 设$dp[i][j]$表示i编号的树的j高度从一开始跳最多能吃多少柿子,每次
阅读全文
摘要:树形DP和状压DP和背包DP 树形$DP$和状压$DP$虽然在$NOIp$中考的不多,但是仍然是一个比较常用的算法,因此学好这两个$DP$也是很重要的。而背包$DP$虽然以前考的次数挺多的,但是现在基本上已经成了人人都能AK的题了,所以也不经常考了。 树形DP 树形DP这个非常特殊,他好像和是唯一一
阅读全文
摘要:"题目" 这个题好坑啊,首先是他会卡空间,然后我们就只能把一种比较好理解的状态给舍弃,因为空间开不下,然而采用一种难理解的状态就是$dp[i][j][l][0/1]$表示$i$,$j$位置,两者的差为$l$,当前由谁来吸收的方案数。 然后我们就可以推出状态转移方程,此状态转移方程很好写,主要就是状态
阅读全文
摘要:$题目$ 为什么这个题会有图论的标签啊,虽然图论也包括找树的重心,可是这很容易让人联想到最短路,但不得不说,这是一个典型的找树的重心模板题。 树的重心是什么? 找到一个点,其所有的子树中最大的子树节点数最少,则这个点便是树的重心。 而我们找树的重心该怎么找呢,我们可以从定义入手,我们可以搜索。 我们
阅读全文
摘要:$题目$ 不得不说,最近我特别爱刷这种区间DP题,因为这个跟其他的DP有些不一样的地方,主要是有一定的套路,就是通过小区间的状态更新大区间,从而得到原题给定区间的最优解。 $但是$ 这个题应该跟$石子合并$差不多,不同的几点就是一个是小区间加小区间,一个是小区间$*$小区间。实际上本质都是一样的,但
阅读全文
摘要:题目: 这个题很明显是一个区间DP,但是比较不同的是,这个题它很像区间DP的经典题——石子合并。 然后我傻傻的搞了这个题搞了一下午,然后几乎看遍了全网的题解,就只看懂了这个方法,可能是我太菜了吧,但是我还是不懂别人的题解为什么区间DP的右端点可以在左端点左边啊 因此我们可以先转化成石子合并,然后还要
阅读全文
摘要:单调队列应该都懂,就是一个满足单调性的队列,如果呀 斜率优化是一个神奇的东西,一般隐藏得很深,且如果你根本就没听说过斜率优化,根本就没法想到该怎么优化,但是当你推出状态转移方程时, 矩阵加速比较简单,主要处理一些递推式其中全是加法,这样我们用矩阵快速幂就可以达到加速的效果,但是特别的一点就是,一定要
阅读全文
摘要:dp(动态规划)顾名思义便是动态的一种规划,而这种规划往往会跟状态,状态转移方程,记忆化搜索扯上关系,当然DP也是各个OI考试的必考点和常考点,在毒瘤出题人的折磨下,出现了许许多多的动态规划,有线性,背包,环形,插头,区间,数位,状压等等各种动态规划,最近刚刚吧区间和数位DP学会。 区间DP:一看就
阅读全文
摘要:题目 这个题一开始能看出来是一道动态规划的题目,但是并不知道如何写状态转移方程,但是我们可以想一想这个题应该是一道区间DP,而区间DP的特点就是状态转移方程一般跟该区间的左节点和右节点或者中间断点有关,因为我们一次是从两个点中选一个而原题中的a值是(n-(left-right)),因此我们就可以得出
阅读全文