
AcWing算法学习
学习笔记,方便以后按照专题直接刷题
PeterBishop0
一起进步!
展开
-
算法提高课:3.1.3 单源最短路的扩展应用
1137. 选择最佳线路原创 2020-10-28 17:03:16 · 348 阅读 · 0 评论 -
算法提高课:3.1.2 单源最短路的综合应用
1135. 新年好340. 通信线路342. 道路与航线341. 最优贸易原创 2020-10-26 16:50:45 · 291 阅读 · 0 评论 -
算法提高课:3.1.1 单源最短路的建图方式
1129. 热浪1128. 信使1127. 香甜的黄油1126. 最小花费920. 最优乘车903. 昂贵的聘礼原创 2020-10-21 17:29:11 · 367 阅读 · 0 评论 -
算法提高课:2.2.3 DFS之迭代加深、双向DFS、IDA*
170. 加成序列原创 2020-10-20 10:32:54 · 314 阅读 · 0 评论 -
算法提高课:2.2.2 DFS之剪枝
这道题目我们肯定是搜索了,我们发现这道题目有两个可以剪枝的部分,一个是如果当前的答案已经大于了我们已知的最小答案,不用说直接return返回即可.第二个剪枝则是,我们可以将小猫的体重从大到小排序,这样我们的搜索树就会缩短许多,至于为什么,因为我们的剩余空间就变小了,然后可选择的猫也就少了.165. 小猫爬山166. 数独167. 木棒168. 生日蛋糕...原创 2020-10-15 15:32:20 · 297 阅读 · 0 评论 -
算法提高课:2.2.1 DFS中的连通性和搜索顺序
十分简单的一道深搜”模板”题.需要注意有多组测试数据,所以一定要记得清空上一次的数据.注意当然还要判断起点和终点是否合法.1112. 迷宫1113. 红与黑1116. 马走日原创 2020-10-15 09:27:31 · 282 阅读 · 0 评论 -
算法提高课:2.1.3 BFS中的双向广搜和A-star
190. 字串变换178. 第K短路原创 2020-10-14 11:45:19 · 309 阅读 · 0 评论 -
算法提高课:2.1.2 BFS中的多源BFS-双端队列BFS
173. 矩阵距离原创 2020-10-13 14:36:43 · 327 阅读 · 0 评论 -
算法提高课:2.1.1 BFS中的Flood Fill和最短路模型
1097. 池塘计数1098. 城堡问题1106. 山峰和山谷1076. 迷宫问题188. 武士风度的牛1100. 抓住那头牛原创 2020-10-12 16:36:44 · 304 阅读 · 0 评论 -
算法提高课:1.10 斜率优化的DP问题
300. 任务安排1301. 任务安排2302. 任务安排3303. 运输小猫原创 2020-10-07 12:38:41 · 288 阅读 · 0 评论 -
算法提高课:1.9 单调队列优化的DP问题
135. 最大子序和1088. 旅行问题1089. 烽火传递二分+单调队列首先假设空题段为m,那么问题就成了能不能在时间t内,完成任意道题,使这些题的最大空题段为m,就简化成了烽火台那道题.空题段很明显是可以通过二分来的,所以这道题就是二分+烽火台1090. 绿色通道1087. 修剪草坪1091. 理想的正方形...原创 2020-10-06 21:42:03 · 302 阅读 · 0 评论 -
算法提高课:1.8 数位DP
1081. 度的数量1082. 数字游戏1083. Windy数1084. 数字游戏 II1085. 不要621086. 恨7不成妻原创 2020-10-05 20:51:00 · 272 阅读 · 0 评论 -
算法提高课:1.7 树形DP
考虑到链一定是连续的,且在树上有两种情况:蓝色表示,链上深度最浅的点是链的一端的情况.而红色表示,链的两端都不是链上最浅的点.而显然,对于蓝色的链,其最浅的点仍然可以向上拓展,而红色不行.那么,问题就可以用树形dp解决了.设f[u]表示以u为链的一端,且u为链上最浅的点的最长链的长度这样我们就可以得到最长的蓝色链,转移方程也不难得出:那么红色的呢?考虑到每一条红色链都能被它的最浅的点分成两条蓝色链,那么在决策点u时顺便更新答案即可1072. 树的最长路...原创 2020-10-05 14:57:42 · 310 阅读 · 0 评论 -
算法提高课:1.6 区间DP
1068. 环形石子合并320. 能量项链1069. 凸多边形的划分在计算每个状态的过程中,记录每个区间的最大值所对应的根节点编号。那么最后就可以通过DFS求出最大加分二叉树的前序遍历了。479. 加分二叉树321. 棋盘分割...原创 2020-09-29 15:21:54 · 392 阅读 · 0 评论 -
算法提高课:1.5 状态压缩DP
1064. 小国王327. 玉米田292. 炮兵阵地524. 愤怒的小鸟原创 2020-09-27 09:31:57 · 283 阅读 · 0 评论 -
算法提高课:1.4 状态机模型
1049. 大盗阿福1057. 股票买卖 IV1058. 股票买卖 V不包含子串等价于kmp走不到m的路径1052. 设计密码原创 2020-09-25 11:57:33 · 223 阅读 · 0 评论 -
算法提高课:1.3.4 背包模型(四)
1021. 货币系统532. 货币系统7. 混合背包问题10. 有依赖的背包问题11. 背包问题求方案数734. 能量石原创 2020-09-24 16:40:42 · 243 阅读 · 0 评论 -
算法提高课:1.3.3 背包模型(三)
1020. 潜水员12. 背包问题求具体方案原创 2020-09-23 18:02:15 · 243 阅读 · 0 评论 -
算法提高课:1.3.2 背包模型(二)
8. 二维费用的背包问题1020. 潜水员278. 数字组合多重背包1019. 庆功会完全背包1023. 买书原创 2020-09-22 19:40:25 · 267 阅读 · 0 评论 -
算法提高课:1.3.1 背包模型(一)
01背包模板题423. 采药1024. 装箱问题1022. 宠物小精灵之收服原创 2020-09-21 11:24:22 · 326 阅读 · 0 评论 -
算法提高课:1.2.2 最长上升子序列模型(二)
1010. 拦截导弹187. 导弹防御系统原创 2020-09-19 10:50:49 · 274 阅读 · 0 评论 -
算法提高课:1.2.1 最长上升子序列模型(一)
1017. 怪盗基德的滑翔翼原创 2020-09-18 15:52:09 · 234 阅读 · 0 评论 -
算法提高课:1.1 数字三角形模型
1015. 摘花生1018. 最低通行费1027. 方格取数275. 传纸条原创 2020-09-17 17:24:55 · 323 阅读 · 0 评论 -
算法基础课:第七章 时空复杂度分析
原创 2020-09-17 11:02:04 · 352 阅读 · 0 评论 -
算法基础课:第六章 贪心(二)
排序不等式913. 排队打水绝对值不等式104. 货仓选址推公式125. 耍杂技的牛原创 2020-09-17 10:30:04 · 248 阅读 · 0 评论 -
算法基础课:第六章 贪心(一)
区间问题905. 区间选点908. 最大不相交区间数量原创 2020-09-17 10:00:16 · 286 阅读 · 0 评论 -
算法基础课:第五章 动态规划(三)
数位统计DP338. 计数问题状态压缩DP291. 蒙德里安的梦想91. 最短Hamilton路径树形DP285. 没有上司的舞会记忆化搜索901. 滑雪原创 2020-09-15 14:28:35 · 278 阅读 · 0 评论 -
算法基础课:第五章 动态规划(二)
898. 数字三角形895. 最长上升子序列896. 最长上升子序列 II897. 最长公共子序列902. 最短编辑距离899. 编辑距离282. 石子合并原创 2020-09-14 21:32:29 · 270 阅读 · 0 评论 -
算法基础课:第五章 动态规划(一)
2.01背包问题3. 完全背包问题4. 多重背包问题 I5. 多重背包问题 II9. 分组背包问题原创 2020-09-14 20:27:14 · 328 阅读 · 0 评论 -
算法基础课:第四章 数学知识(四)
容斥原理for (int i = 1; i < 1 << m; i ++ ) // i<1<<m 组合数 2^m-1 { int t = 1, s = 0; for (int j = 0; j < m; j ++ )//遍历二进制的每一位 if (i >> j & 1)//判断二进制第j位是否存在 {原创 2020-09-12 21:39:48 · 573 阅读 · 0 评论 -
算法基础课:第四章 数学知识(三)
高斯消元// a[N][N]是增广矩阵int gauss(){ int c, r; for (c = 0, r = 0; c < n; c ++ ) { int t = r; for (int i = r; i < n; i ++ ) // 找到绝对值最大的行 if (fabs(a[i][c]) > fabs(a[t][c])) t = i; .原创 2020-09-11 09:21:24 · 315 阅读 · 0 评论 -
算法基础课:第四章 数学知识(二)
求欧拉函数int phi(int x){ int res = x; for (int i = 2; i <= x / i; i ++ ) if (x % i == 0) { res = res / i * (i - 1); while (x % i == 0) x /= i; } if (x > 1) res = res / x * (x - 1); retu原创 2020-09-09 11:44:13 · 321 阅读 · 0 评论 -
算法基础课:第四章 数学知识(一)
试除法判定质数bool is_prime(int x){ if (x < 2) return false; for (int i = 2; i <= x / i; i ++ ) if (x % i == 0) return false; return true;}866. 试除法判定质数试除法分解质因数void divide(int x){ for (int i = 2; i <= ...原创 2020-09-01 11:35:56 · 465 阅读 · 0 评论 -
算法基础课:第三章 搜索与图论(三)
朴素版prim算法时间复杂度是 O(n2+m),n表示点数,m表示边数int n; // n表示点数int g[N][N]; // 邻接矩阵,存储所有边int dist[N]; // 存储其他点到当前最小生成树的距离bool st[N]; // 存储每个点是否已经在生成树中// 如果图不连通,则返回INF(值是0x3f3f3f3f), 否则返回最小生成树的树边权重之和int prim(){ memset(dist, 0...原创 2020-08-31 11:17:28 · 386 阅读 · 0 评论 -
算法基础课:第三章 搜索与图论(二)
朴素dijkstra算法时间复杂是 O(n2+m),表示点数,m表示边数int g[N][N]; // 存储每条边int dist[N]; // 存储1号点到每个点的最短距离bool st[N]; // 存储每个点的最短路是否已经确定// 求1号点到n号点的最短路,如果不存在则返回-1int dijkstra(){ memset(dist, 0x3f, sizeof dist); dist[1] = 0; for (int i = 0; i ...原创 2020-08-30 11:20:24 · 358 阅读 · 0 评论 -
算法基础课:第三章 搜索与图论(一)
DFS回溯(恢复现场)剪枝842. 排列数字843. n-皇后问题BFS队列存储的数据结构状态之间的距离844. 走迷宫845. 八数码树与图的存储树是一种特殊的图,与图的存储方式相同。对于无向图中的边ab,存储两条有向边a->b, b->a。因此我们可以只考虑有向图的存储。(1) 邻接矩阵:g[a][b] 存储边a->b(2) 邻接表:// 对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点原创 2020-08-29 11:30:49 · 561 阅读 · 0 评论 -
算法基础课:第二章 数据结构(三)
哈希表存储结构开放寻址法链地址法(1) 拉链法 int h[N], e[N], ne[N], idx; // 向哈希表中插入一个数 void insert(int x) { int k = (x % N + N) % N; e[idx] = x; ne[idx] = h[k]; h[k] = idx ++ ; } // 在哈希表中查询某个数是否存在 bool find原创 2020-08-28 20:06:00 · 366 阅读 · 0 评论 -
算法基础课:第二章 数据结构(二)
Trie树高效存储和查找字符串集合的数据结构int son[N][26], cnt[N], idx;// 0号点既是根节点,又是空节点// son[][]存储树中每个节点的子节点// cnt[]存储以每个节点结尾的单词数量// 插入一个字符串void insert(char *str){ int p = 0; for (int i = 0; str[i]; i ++ ) { int u = str[i] - 'a'; if (!原创 2020-07-31 10:45:11 · 319 阅读 · 0 评论 -
算法基础课:第二章 数据结构(一)
链表和邻接表单链表:邻接表(存储图和树)// head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点int head, e[N], ne[N], idx;// 初始化void init(){ head = -1; idx = 0;}// 在链表头插入一个数avoid insert(int a){ e[idx] = a, ne[idx] = head, head = idx ++ ;}// 将头结点删除,原创 2020-07-30 20:13:20 · 395 阅读 · 0 评论 -
算法基础课:第一章 基础算法(三)
双指针算法核心在于优化了O(n^2)成O(n)for (int i = 0, j = 0; i < n; i ++ ){ while (j < i && check(i, j)) j ++ ; // 具体问题的逻辑}常见问题分类: (1) 对于一个序列,用两个指针维护一段区间 (2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作799. 最长连续不重复子序列800. 数组元素的目标和位运算求n.原创 2020-07-30 10:27:11 · 529 阅读 · 0 评论