![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
笔记
zxw0819
这个作者很懒,什么都没留下…
展开
-
KMP算法(字符串匹配)
先来个理论上的分析 首先,字符串”BBC ABCDAB ABCDABCDABDE”的第一个字符与搜索词”ABCDABD”的第一个字符,进行比较。因为B与A不匹配,所以搜索词后移一位。 因为B与A不匹配,搜索词再往后移。 就这样,直到字符串有一个字符,与搜索词的第一个字符相同为止。 继续搜索,直到字符串有一个字符,与搜索词对应的字符不相同为止。这时,最自然的反应是,将搜索词整个原创 2017-02-20 16:57:33 · 210 阅读 · 0 评论 -
排列组合
先补充一个其它的东西—–二项式定理: 排列:定义:从n个不同元素中,任取m(m≤n,m与n均为自然数,下同)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 A(n,m)表示。 计算公式: 此外规定0!==1其满足:A(n,m)=n×A(n-1,m-1);(编原创 2017-05-12 10:00:32 · 6290 阅读 · 5 评论 -
01分数规划
题套: 有一堆物品,每一个物品有一个收益ai,一个代价bi,我们要求一个方案使选择的∑ai/∑bi为最值。套路解题: 我们可用二分。设我们求的是最大,则我们要使∑ai/∑bi>=x ,等价于∑a[i]-x*∑b[i]>=0例一: Dropping Tests poj2976#include<cstdio>#include<algorithm>using namespace std;int原创 2017-08-01 16:07:12 · 250 阅读 · 0 评论 -
精析背包四讲
No1. 01背包: 题套: 有N件物品和一个容量为V的背包。第i件物品的体积是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大。 基本思路 : 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v原创 2017-07-31 11:48:14 · 354 阅读 · 0 评论 -
Treap--简单的平衡二叉搜索树
它基本的支持一下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,只删除一个) 3. 查询x数的排名(若有多个相同的数,输出最小的排名) 4. 查询排名为x的数 5. 求x的前驱(前驱定义为小于x,且最大的数) 6. 求x的后继(后继定义为大于x,且最小的数) 模板如下:#include<cstdio>#include<cstdlib>//有rand()[随机函数]#inc原创 2017-06-19 21:36:58 · 251 阅读 · 0 评论 -
网络流--最大流
直接贴模板:#include<cstdio>#include<cstring>#include<queue>#include<algorithm>using namespace std;const int maxm=100000+5,maxn=100000+5,inf=100000000;int head[maxm],tot=1;//因反向边用^ 所以不能是0; int n,m,s,t原创 2017-05-08 20:30:06 · 301 阅读 · 0 评论 -
网络流--平面图转换对偶图
今天所讲的一种模型,是将平面图转换为对偶图,用最短路来求最小割。它的速度比起裸最小割(Dinic)更快(但是仅适用于网格图)。 平面图:可以画在平面上边不相交的图。(网格图) 性质:若一个连通的平面图有n个点,m条边,f个面,则 f=m-n+2对于平面图G,可以找到它的对偶图G*: G*中的每个点对应G中的面; 即对于G中的每条边,都会“挨着”两个面,这两个面对应着G*中的两个点,那么对这两原创 2017-05-08 22:02:39 · 1213 阅读 · 0 评论 -
网络流--最小费用最大流
还是贴代码:#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;const int MAXN=5005,MAXM=50005,INF=~0U>>1;int N,M,S,T;int minCost,maxFlow;struct E{int next,to,cap,cost;}原创 2017-05-08 20:40:05 · 527 阅读 · 0 评论 -
去重函数
在STL中unique函数是一个去重函数, unique的功能是去除相邻的重复元素(只保留一个),其实它并不真正把重复的元素删除,是把重复的元素移到后面去了,然后依然保存到了原数组中,然后 返回去重后最后一个元素的地址,因为unique去除的是相邻的重复元素,所以一般用之前都会要排一下序。t=unique(a+1,a+n+1);原创 2017-05-05 21:01:14 · 976 阅读 · 0 评论 -
求一个数的所有约数
介绍一种O(sqrt(n))的算法:void pre (int x){ for(int i=1;i*i<=x;i++) { if(x%i==0) { a[++cnt]=i; if(x!=i*i) a[++cnt]=x/i; } }}即用sqrt(n)将1~n分开,我们只用求前原创 2017-05-04 19:11:22 · 6555 阅读 · 3 评论 -
行列式
行列式在数学中,是由解线性方程组产生的一种算式,是取自不同行不同列的n个元素的乘积的代数和。介绍两个概念: 主对角线:左上方与右下方组成的对角线。 次对角线:另一条对角线。(右上到左下)介绍两个最重要的性质: 1、上三角行列式(下三角行列式)的值等于其主对角线上n个元素的乘积。 2、互换行列式的两行(列),行列式变号(正、负)。1.二阶行列式定义:由四个数排成两行两列的数表。 计算:二原创 2017-05-11 20:46:15 · 2345 阅读 · 0 评论 -
欧拉
诸多东西就不证明了欧拉函数: 设n为正整数,以 φ(n)表示不超过n且与n互质的正整数的个数,称为n的欧拉函数值。以下代码就是求互质的个数:#include<cstdio>using namespace std;int ok(int n){ int ans=n; for(int i=2;i*i<=n;i++) { if(n%i==0)原创 2017-04-22 10:10:38 · 243 阅读 · 0 评论 -
生成树计数
问题即:给定一n个点的无向图,求其生成树的个数。 我们需要用到Matrix-tree定理,又叫Kirchhoff矩阵定理,于1847年首次被基尔霍夫先生证明,后来被广泛应用于生成树的计数问题。定义:图G的基尔霍夫矩阵C[G]=D[G]-A[G]. 其中,D[G]为此无向图G的度数矩阵,A[G]为此图的邻接矩阵. 度数矩阵: 表示的是点的度(类比有向图中的出、入度); 对于i行j列的矩阵来说原创 2017-05-11 21:29:55 · 960 阅读 · 0 评论 -
强连通分量(Tarjan、Kosaraju)
先介绍一下强连通分量: 首先,强连通分量只可能存在于有向图中,无向图中是不存在强连通分量的,当然,无向图中也有对应物,被称为连通分量,求解无向图中的连通分量,根据具体要求,可以选择使用并查集或者DFS。 对于一个强连通分量中的任意一对顶点(u,v),都能够保证分量中存在路径使得u->v,v->u看图: 以上用虚线围绕的部分就是一个强连通分量,因此上图中总共含有三个。上图中由a,b,e这三个顶点原创 2017-05-10 21:26:26 · 634 阅读 · 0 评论 -
st 表--求区间最值
(本文以最小值为例) 举例: 给出一数组A[0~5] = {5,4,6,10,1,12},则区间[2,5]之间的最值为1。方法:ST算法分成两部分:离线预处理 (nlogn)和 在线查询(O(1))。虽然还可以使用线段树、树状链表等求解区间最值,但是ST算法要比它们更快,而且适用于在线查询。(1)离线预处理:运用DP思想,用于求解区间最值,并保存到一个二维数组中。(2)在线查询:对给定区间进行分转载 2017-05-10 17:25:14 · 323 阅读 · 0 评论 -
状态压缩DP
状压dp中大量用到位运算,下面就简单介绍几种常见的位运算。## 状压 ##:解法需要保存一定的状态数据,每个状态数据通常情况下是可以通过2进制来表示的。这就要求状态数据的每个单元只有两种状态,比如说棋盘上的格子,放棋子或者不放,或者是硬币的正反两面。这样就可以用0或者1来表示状态数据的每个单元,而整个状态数据就是一个0、1组成的二进制数。接下来,我们再看一道题。题目大意:输入n和m表示一个n*m的矩原创 2017-03-22 21:12:36 · 315 阅读 · 2 评论 -
二维单调队列
二维单调队列(二维)单调队列通常解决区间最值问题 。 比如: 有一个 a*b 的整数组成的矩阵,现请你从中找出一个 n*n 的正 方形区域,使得该区域所有数中的最大值和最小值的差最小。先介绍一下单调队列: 问题描述:用一个长度为k的窗在整数数列上移动,求窗里面所包含的数的最大值。 解法一: 很直观的一种解法,那就是从数列的开头,将窗放上去,然后找到这最开始的k个数的最大值,然后窗原创 2017-03-08 20:47:55 · 2623 阅读 · 1 评论 -
KMP算法
KMP算法思想我们首先用一个图来描述kmp算法的思想。在字符串O中寻找f,当匹配到位置i时两个字符串不相等,这时我们需要将字符串f向前移动。常规方法是每次向前移动一位,但是它没有考虑前i-1位已经比较过这个事实,所以效率不高。事实上,如果我们提前计算某些信息,就有可能一次前移多位。假设我们根据已经获得的信息知道可以前移k位,我们分析移位前后的f有什么特点。我们可以得到如下的结论: 1. A段字符原创 2017-03-01 20:49:17 · 282 阅读 · 0 评论 -
求斐波那契数列的多种方法(有矩阵(附好模板))
f[1]=1; f[2]=2; f[n]=f[n-1]+f[n-2]; (1)递推long long fib(int n){ if(n==1) return 1; if(n==2) return 2; return fib(n-1)+fib(n-2);}(2) 循环long long fib(int n){ long long a=1,b=2,c; i原创 2017-08-09 21:31:53 · 691 阅读 · 1 评论