随笔分类 - 算法竞赛
1
摘要:(一) 股票系列问题 所谓的股票问题,是一个动态规划状态机模型的系列问题,这些题目来自于LeetCode社区,这些问题非常经典,能够帮助我们理解动态规划的本质,这些问题大多初看之下会令人感觉无从下手,但是一旦掌握相应的方法划分状态之后,很快即可举一反三的写出相应的代码。 股票系列问题合集 LC121
阅读全文
摘要:(一) 排列与组合 通常通常循环来做暴力枚举是有局限性,通过回溯算法来做枚举往往会更加优雅,回溯算法中两个重要的模型便是组合模型与排列模型。 | 题目 | 思路描述 | | : : | : : | | LC0077. 组合LC0078. 子集 | 组合和子集要求的答案都是顺序无关的,因而与排列不同的
阅读全文
摘要:推荐练习题单: LeetBook 树专题、洛谷二叉树树结构专题、洛谷树上问题 (一) 线性结构的递归模型 正式学习树结构模型之前不妨先回忆一下线性结构的递归写法。众所周知,链表是一种天然带有递归性质的结构,当我们想要处理 $Node_A$ 为首的链表,我们尝试处理 $Node_B$ 为首的链表,然后
阅读全文
摘要:(一) 正权图最短路引理 以下三条引理适用于正权图: 任意两个顶点之间的路径不存在重复顶点与重复边 任意两个顶点之间顶点数不超过 $N$,边数不超过 $N-1$ 最短路径具有最优子结构性,也即 $P_{s\to t}$ 节选得到的 $P_{s \to x}$ 即是 $s\to x$ 最短路径 对于一
阅读全文
摘要:(一) 二分图的概念 二分图又称作二部图,是图论中的一种特殊模型。假设 $G=(V,E)$ 是一个无向图,如果顶点 $V$ 能够分割为两个互不相交的子集 $(S,T)$,并且图中的每条边 $(s,t)$ 所关联的两个顶点 $s$ 和 $t$,分别属于这两个不同的顶点集 $(s \in S,t \in
阅读全文
摘要:(一)单调栈查找前驱值与后继值 单调栈其实就是一个栈,并非什么新颖的数据结构,是栈结构的一种十分常用的操作,与用栈进行括号匹配、表达式求值乃至模拟递归一样,都是单调栈仅仅是一种常见的用途。 单调栈是一种满足单调性的栈结构,其维护单调性方式是弹出栈顶不符合的条件的元素,也就是说,单调栈存储的并非入栈的
阅读全文
摘要:本篇内容是对蒋炎岩老师讲义整理,强烈建议观看原视频! (一)网络流引入 最短路、网络流等是最小费用流的一个特列,最小费用流其实是线性规划的一个特例。很多现实中的问题均可规约变为线性规划问题,通常竞技算法会解决整数线性规划问题。线性规划之上,又有凸优化等更加复杂的问题,这一切都离不开 对偶理论。例如,
阅读全文
摘要:(一)区间模型 (1.1) 区间合并 (1.2) 区间选点 (1.3) 区间覆盖 (1.4) 区间分组 (二) 贪心常用证明方法
阅读全文
摘要:(一)背包模型 背包问题的各种变形可以搜一下背包九讲,事实上我们只需要掌握三种零一背包、多重背包、完全背包三种基础问题即可,其它复杂的问题往往都可以转为这三种基础的背包问题。更多细节可参考这篇笔记,下面给出提纲。 零一背包 & 完全背包 为什么二者的状态转移方程如此相似? 零一背包逆序遍历优化 完全
阅读全文
摘要:(一) Nim博弈 所谓 Nim 博弈是指,给定一堆石子,第 $i$ 堆物品共有$A_i$,两个玩家轮流行动,每次可以任选一堆,从中取走任意数量的物品,可把一堆取光,但不可不取,两人都采取最优策略,问先手是否必胜,也即第一个行动的称为先手。Nim 博弈不存在的平局,只有先手必胜与先手必败两种情况,
阅读全文
摘要:(一)最近公共祖先 如图所示,树节点 $2$ 与 $7$ 公共祖先即为图中的树节点 $5$,又如图中树节点 $2$ 与 $5$ 公共祖先即为 $5$;以下内容参考了 OI-Wiki,首先大致了解一下公共祖先具有下列性质: 如果 $u$ 不为 $v$ 公共祖先且 $v$ 不为 $u$,那么 $u$ 与
阅读全文
摘要:(一)生成树 阅读之前,需要掌握贪心算法、并查集、图数据结构存储的前置知识,否则读起来会很吃力。通俗来说,生成树是指从一个图中提取一个树结构,最小生成树是指边权总和最小的生成树。本节我们需要讨论最小生成树、次小生成树等变体问题,当然有些时候我们要算的也有可能是最大生成树生成树,相关算法的综述参考 O
阅读全文
摘要:(一) 素数判定与筛选 给定一个正整数 $N$,如果存在一个数 $T$,$T$ 满足 $(2\leq T \leq N -1)$ 则称 $N$ 是一个合数,如果不存在这样这样的因数 $T$,则称$N$ 质数。简单来说,一个数$N$ 如何仅能被 $1$ 与 $N$ 本身整除,则称这个数字是质数,或称素
阅读全文
摘要:(一)哈希表简述 Waiting... (二)使用哈希表优化复杂度 (2.1)两数之和 Waiting... (2.2)子数组异或和 枚举数组的左端点以及数组长度, #include <bits/stdc++.h> #include <algorithm> using namespace std;
阅读全文
摘要:(一)如何优化暴力算法 Waiting... (二)KMP模板 KMP 算法的精髓在于 $next$ 数组,$next[i]=j$ 代表 $p[1,j]=p[i-j+1,i]$,$next[i]$ 数值意义代表 $p[1,i]$ 所有前缀与后缀的最长公共部分,我们约定本文提到的前缀与后缀均为不包含原
阅读全文
摘要:Trie模板 Trie 是一种用于实现字典序快速检索的多叉树结构,Trie 每个节点都有若干的字符指针,若在扫扫描字符串时扫到字符 $c$,则沿着当前节点 $c$ 字符指针走向该指针指向的节点。初始化阶段,Trie近包含一个空节点,其所有字符指针均为空。 通过数组模拟字典树,分配树节点的方式与数组模
阅读全文
摘要:使用数组模拟常用的数据结构 我们可以使用数组作为下列抽象容器的存储结构 链表 栈 队列 堆 哈希表 并查集
阅读全文
摘要:经典逆序对问题的几个解法,暴力、归并与树状数组。
阅读全文
1

浙公网安备 33010602011771号