- 博客(36)
- 收藏
- 关注
原创 2-SAT,用连通分量编号确定答案
并非拓扑序,从树来看,若a比a非深度更深切a非为a的祖先节点,则必不能选a非,只能选a,如果a非不为a的祖先。节点,则选哪个都不冲突。
2024-08-22 21:51:22 259
原创 Codeforces Round 961 (Div. 2)D. Cases枚举子集,由初始限制状态更新到复杂较错状态是否合法
Codeforces Round 961 (Div. 2) - Luckyblock - 博客园 (cnblogs.com)
2024-07-24 19:45:29 178
原创 动态规划(状态转移,维度变化,深入解释
即在计算新状态时一个状态的值可以用另一个状态的值计算而来,所以在转移的时候一个状态可以不用保留。比如xx情况下pp情况下的状态,假设xx和pp有关,也就意味着知道xx状态时pp状态也随之确定。状态越多转移携带的信息越多越有利于计算转移之后的状态,但维度升高,时间和空间复杂度都增大。在xx情况的xx情况下的某种最优状态的值就是二维dp。计算新的状态做出决策之后的更优的值即dp本身的值。使得下一次状态更新的时候所用的dp值都是最优的。即相应状态下做出的决策的结果都是最优的。计算新的状态保留的状态参数。
2023-12-14 00:36:47 484
原创 Treap区间翻转数据结构无旋 treap
我们只需要把区间的下标依次插入 treap 中,这样在中序遍历(先遍历左子树,然后当前节点,最后右子树)时,就可以得到这个区间.通过这两种操作,在很多情况下可以比旋转 treap 更方便的实现别的操作。下面逐一介绍这两种操作。又称分裂合并 treap。它仅有两种核心操作,即为。
2023-09-28 23:10:06 89
原创 区间动态规划
f(l,r,k)=max(f(l+1,r,k+1),f(l,r+1,k+1))区间dp模型(石子归并)岩石dp模型QiufengWang424的博客-CSDN博客
2023-09-28 23:01:02 50
原创 洛谷 P1078 [NOIP2012 普及组] 文化之旅暴力剪枝法
本题是错题,后来被证明没有靠谱的多项式复杂度的做法。测试数据非常的水,各种玄学做法都可以通过(比如反着扫),不代表算法正确。因此本题题目和数据仅供参考。
2023-09-28 22:41:09 69
原创 线性动态规划
因为存在局部最优解所以全局最优解通过遍历所有的局部最优解得来,即往前遍历,而局部最优解又可以由局部的局部最优解得来,dp过程相当于暴力搜索所有状态,但在取最优解的过程中略去了那些不能导致全局最优解的情况,但有些时候并不能省去那些解,有时候局部差的解可能后面真的用到了。求最长公共子序列的题目有不同的类型,比如序列不含重复元素的就可以用二分的方法优化,但含重复元素的序列就只能用n方的dp来优化,并且这将遍历所有情况,比如。做动态规划的题一般分为四个步骤:确定子问题—>定义状态—>转移方程—>避免重复求解。
2023-09-28 22:29:06 42
原创 二分小性质
对于一个求最值收敛的过程,在这个区间上对于所求值其具有比如在一个单调升的有序数组中查询第一个大于x的数,先查询区间中点的数如果大于区间右端点就往左收敛,反之区间左端点往右收敛直到区间收敛成一个点。
2023-08-20 23:00:53 58 1
原创 DAG上dp
DAG上dp必须保证在遍历的时候没有返祖边,而且在遍历的时候虽然采用的是dfs的形式,但在打上访问标记之前必须遍历该状态的所有可能,在前一篇讲到要处理完当前所有状态才能转移,但这里不同的是这里的dp因为没有返祖边,后续的dfs都不会遍历到前面的状态,即没有后续性,判断是不是DGAdp首先判断有没有后续性,或者有后续性看能不能转换成没有后续性的dp。这里有几点需要注意的。
2023-08-20 22:57:37 80 1
原创 dijkstra变体
翻译:正常dijkstra算法是用一个最优点更新其他点,这个是用两个最优点更新其他点,因为直接购买中价格最低的药水一定低于直接购买其他两种药水配制得到这瓶药水的花费,所以一开始只要我们只要从没被访问的药水中给最低价格的打上访问标记并尝试找到另一被访问的节点看看是否能更新其他节点,要必须找到两个已经被访问的节点来更新其他点,同理可以扩展到不仅两瓶药水,dijkstra算法就单点更新变成多点更新。我们已经知道,djikstra要求我们必须从已确定最短路径的点出发,那么对于两个起点该怎么办呢?
2023-08-20 22:54:42 59 1
原创 洛谷P1137 旅行计划题解Dijkstra思想妙用(松弛)
实际上这并不能被称为Dijkstra而是用了spfa的优化方法,因为Dijkstra算法在更新过程中对点进行了筛选即选择状态最佳的点来更新每一个点保证每个点的状态都是最优的,因为其使用了vis数组标记访问故每个点只会被扫描一遍,无法处理负边,而用spfa思想就能解决。所谓松弛就是在对某个点进行更新时,如果这个点的状态更优了,那么其他连接这个状态被优化的点就可能被这个被这个点更新状态,故将这个点加入队列中,并继续更新直到没有点能达到更优状态为止。dijstra改成求最大路径。P1137 旅行计划。
2023-08-20 22:50:08 102 1
原创 有后续性的dp怎么解决
1.把前面的状态全部处理完在转移,但是如果用dfs深搜来转移就会导致前面的状态还没处理完就到达了后面的状态。所以可以采取bfs的方法。2.如果状态没有严格的层次关系,因为如果前面的状态会影响后面的状态,不妨把这两个状态放在一起处理这样状态之间就减少了前后关联性。一些前面状态的选择会影响后面的选择,即一些题目出现的一些限制条件导致你无法确定后面的步骤的可行性。2.不用记忆化搜索,才用松弛的方法来更新数据(大概率会tle)
2023-08-20 22:31:12 87 1
原创 简单背包dp新手易懂
后来你又采第二个药价值为3,花时为1,为了从前往后更新,那你就先用你在第3秒采的药的价值加上假设采了第二个药的价格来更新在第4秒采的药的价格f[4]=max(f[3]+3,f[4])=6。第5秒会被第3秒的价格更新f[5]=max(f[3]+4,f[5])=7。第2秒会被第0秒的价格更新f[2]=max(f[0]+4,f[2])=4。第5秒会被第3秒的价格更新f[5]=max(f[3]+4,f[5])=8。第2秒会被第0秒的价格更新f[2]=max(f[0]+4,f[2])=5。如果看不懂不妨看看下面的。
2023-08-20 22:24:47 92 1
原创 记忆化搜索
1.依旧采用背包思想,背包思想就是前面的选取方法会影响后面的选择方法,不妨想像一条时间纸带,在每一次前面状态的处理中可以在时间纸带的从前往后打上其标记,这样如果后面的转移会用到前面状态留下的标记就可以用该状态进行转移,并且在每一层状态都有其限制的情况下也是可行的,这时只要给每层状态的转移设置转移限制条件,即后面的状态可以不断地被前面到达条件的状态不断更新直至达到条件之后就可以更新后面的状态,如果直到状态已经达到该层了还是未达到转移所必须的条件该状态就会被舍弃或者导致整个状态转移终止。
2023-08-20 22:20:33 78 1
原创 最长公共子序列算法,n<=4500
思路:先保留相同的元素,记录每个元素在b里面对应的下标,在遍历a中元素,在dp数组中优先更新最小的下标,用lower_bound寻找改元素下标中大于等于dp[l+1]的下标来继续更新并把dp[l+1]下标退回,直到更新了长度或者元素的下标用完了之后就结束循环,第一个图第一列是n的大小,第二列是该算法耗时ms,第二列是传统n方算法耗时ms。测试数据是小写的26个字母。这个算法只能求出长度。
2023-07-02 17:49:25 112 1
原创 Codeforces Round 266 (Div. 2) B题解
枚举a之后的长度,通过判断得到的答案的面积(面积=a*(s/a)(向上取整)),是否更小来更新答案。
2023-03-11 23:03:13 101 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人