![](https://img-blog.csdnimg.cn/20190927151026427.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
学习笔记(提高篇)
记录AcWing提高篇的每一个算法和题目的总结。留给自己看,顺便分享给大家。
链接:https://www.acwing.com/activity/content/16/
心情想要飞
这个作者很懒,什么都没留下…
展开
-
学习笔记:差分约束
上讲习题AcWing 1165从一个字符串的前两个字符向最后两个字符连一条权为这个字符串长度的边,表示用这个字符串对平均值的贡献,一个路径就是一个接龙,一个环就是题目要求的。接下来思考解决这个题,本题又是ab\cfrac{a}{b}ba的形式,可以010101分数规划。设VVV为用的字符串的集合,∣X∣|X|∣X∣表示集合XXX的大小,lenXlen_XlenX表示集合XXX内所有元素的长度之和,则原式为lenV∣V∣\cfrac{len_V}{|V|}∣V∣lenV。思考如何二分,设ggg表示原创 2020-10-13 17:45:17 · 157 阅读 · 0 评论 -
学习笔记:负环
上讲习题AcWing 1144有强制连边,先连上。因为本题是稀疏图,所以用KruskalKruskalKruskal更优。本题只有两种边权:1、纵向边的边权;2、横向边的边权。所以我们不需要排序,顺序已经出来了:先试纵向边,再试横向边。#include<bits/stdc++.h>using namespace std;int n,m,fa[1000004];int num(int x,int y){ return (x-1)*m+y;}int find(int u)原创 2020-10-13 14:50:34 · 509 阅读 · 1 评论 -
学习笔记:最小生成树
上讲习题AcWing 1126本题不难发现,想要用的钱尽量少,那么就要转账的过程交的手续费尽量少。因为我们是到达最后要得到100100100元,那么要从ttt向sss求最短路。注意,每一条边的权是转完账后剩余的钱是转账之前的钱的几分之几,则w=1−z÷100w=1-z\div 100w=1−z÷100。因为是反着走,所以如果要求原来的钱就是除以www。#include<bits/stdc++.h>using namespace std;const int NN=2004;vector原创 2020-10-13 11:45:42 · 235 阅读 · 0 评论 -
学习笔记:最短路
上讲习题AcWing 303首先,可以知道想要接到第iii只小猫需要什么时候出发,排序后,那么就变成了最多分成ppp部分,每部分内的费用为最后一个任务的时间分别减去前面每个任务的时间之和,求最小费用。于是设fj,if_{j,i}fj,i表示前iii只猫分成jjj部分的最小代价,则fj,i=min(fj−1,k+ai×(i−k)−(si−sk),0≤k<i)f_{j,i}=\min(f_{j-1,k}+a_i\times (i-k)-(s_i-s_k),0\le k<i)fj,i=min原创 2020-10-12 12:47:09 · 217 阅读 · 0 评论 -
学习笔记:斜率优化dp
上讲习题AcWing 1087本题可以想到,设fif_ifi为前iii头牛合法选择的最大效益。首先可以不选,fi=fi−1f_i=f_{i-1}fi=fi−1。考虑选择第iii头牛,可以枚举一个jjj表示iii开始往前连续的牛的数量,保证1≤j≤k1\le j\le k1≤j≤k即可。则这一段牛就是∑x=i−j+1i\displaystyle\sum_{x=i-j+1}^ix=i−j+1∑i,为了保证不选第i−ji-ji−j头牛,那么就是用fi−j−1f_{i-j-1}fi−j−1。于是有状态原创 2020-10-07 13:27:17 · 296 阅读 · 0 评论 -
学习笔记:单调队列优化dp
上讲习题AcWing 1082同样的方法,如果填的不是边界,那么后面的就可以随便填,填的是边界就要继续枚举后面填的情况。考虑随便填的方案数,设fi,jf_{i,j}fi,j为有iii位且最高位为jjj的数的个数。要想满足题目要求,则枚举次高位的数,要求次高位比最高位大即可,即fi,j+=fi−1,k,k>=jf_{i,j}+=f_{i-1,k},k>=jfi,j+=fi−1,k,k>=j。枚举当前填的数时,要求当前填的数比上一位填的数大或等于即可。最后,还有一种每一位都填边界的方原创 2020-10-06 20:14:38 · 256 阅读 · 0 评论 -
学习笔记:数位dp
上讲习题AcWing 1075本题每个数都可以变成下一个点,很像某个点向下一个点连边。一个数只有一个因子和,但是有可能多个数的因子和等于某个数,就像是一个点只有一个爹,但是会有多个儿子,所以这样建图是一棵树,每个点的爹就是自己的因子和。任意一个序列都对应树的一条路径,要求最长的序列就是求树的直径。求树的直径参考上讲的AcWing 1072。#include<bits/stdc++.h>using namespace std;const int NN=50004;int sum[NN]原创 2020-10-06 12:18:58 · 153 阅读 · 0 评论 -
学习笔记:树形dp
上讲习题AcWing 320这个题是环形的,首先处理环就是再接一段。然后考虑本题的操作,发现这个题就是把一些东西合并到一起,每次都有一个代价,求代价的最大值,而且必须是连续的。这样刚好满足区间dpdpdp的要求,则本题可以用区间dpdpdp解。设fi,jf_{i,j}fi,j为iii到jjj的区间内合并成一个的最大代价,因为ri=li+1r_i=l_{i+1}ri=li+1,则有状态转移方程fi,j=max(fi,k+fk+1,j+ai×ak+1×aj+1)f_{i,j}=\max(f_{i,k原创 2020-10-04 12:30:19 · 170 阅读 · 0 评论 -
学习笔记:区间dp
上讲习题AcWing 292这个题目是互相攻击类的题目,很容易想到每一排的状态然后判断两排是否能放在一起。但是不难发现,本题行与行之间的限制有两排,则在fff数组中要存下最两排选择的是什么状态才可以确定是否可以新加某一行。设fi,j,kf_{i,j,k}fi,j,k表示确定完了前iii行,倒数两行的状态分别是j,kj,kj,k的最大放置个数。设cntucnt_ucntu为选择状态uuu能够多放的炮车数量,则有状态转移方程fi,k,u=max(fi,k,u,fi−1,j,k+cntu)f_{i,k,原创 2020-10-02 17:31:37 · 171 阅读 · 0 评论 -
学习笔记:状态压缩dp
上讲习题AcWing 1058这个题目可以把上讲的AcWing 1057的思路中卖出的情况拆成两种:刚卖出、出了冷冻期。则设fi,0,fi,1,fi,2f_{i,0},f_{i,1},f_{i,2}fi,0,fi,1,fi,2分别表示手中持有股票、今天卖出和过了冷冻期的方案。首先考虑买入,买入必须过了冷冻期,所以不能用刚卖出的方案更新买入,fi,0=max(fi−1,0,fi−1,2−wi)f_{i,0}=\max(f_{i-1,0},f_{i-1,2}-w_i)fi,0=max(fi−1,0原创 2020-09-29 20:27:48 · 140 阅读 · 0 评论 -
学习笔记:状态机模型
上讲习题AcWing 1024要求剩余的空间尽量少,那么就是使用的空间尽量多。所以就变成了每个物品有重量,求最多装多少的问题。发现这个题目就是一个背包问题,但是没有价值,因为是求最多装多少,很像背包问题求最大价值,则可以把体积同时当成价值,这样就是求的最多装多少了。每个物品只有一个,这个题就是一个010101背包。最后用总的减去最多装的就是最少剩余的。#include<bits/stdc++.h>using namespace std;int a[34],f[20004];int m原创 2020-09-29 17:24:13 · 283 阅读 · 0 评论 -
学习笔记:背包模型
上讲习题AcWing 482这个题和上一讲的AcWing 1014没有任何区别。出队的越少留下的就越多,用nnn减去最长的一个子序列即可。#include<bits/stdc++.h>using namespace std;const int NN=1004;int a[NN],f1[NN],f2[NN];int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i原创 2020-09-28 20:15:19 · 996 阅读 · 0 评论 -
学习笔记:子序列模型
上讲习题:AcWing 275法一:和上一题法一基本一模一样。本题不让走到同一点,那么就判断是否是同一点,是同一点就不计算。如果是从同一点过来的,那么那个点之前就没有更新,所以是零,最大值绝对不是它,所以也不会用它更新。因为两条路都会到最后一个点,所以最后一个点不会更新,直接输出差一步到达终点的两条路径即可。注意,这样的两条路径只有一个:从左边和上边来的两条路径。#include<bits/stdc++.h>using namespace std;const int NN=54;i原创 2020-09-28 11:43:47 · 233 阅读 · 0 评论 -
学习笔记:数字三角形模型
概念:动态规划,解决问题的一种方法。将很多问题转换成多个子问题求解,先计算子问题,到达边界直接返回问题的值,最后得到最终答案的一种方法。动态规划分为两大类:记忆化搜索和递推。记忆化搜索更好写,但常数更高;递推不太好写,但是常数低。二者时间复杂度无特殊情况基本相同。状态转移方程:将一个问题转换成子问题计算得到结果的方程。dpdpdp:动态规划的简称。数字三角形模型:概念:数字三角形,就是一个三角形,每一个点都有一个数字,找一条路径满足题目要求。形如:1112 32 32 34 5 64 5 64原创 2020-09-27 17:43:57 · 417 阅读 · 0 评论