摘要:
准确来说,动态规划是一种思想,而不是一种算法。算导里将它归结为——高级程序设计技巧。 在线性结构上进行状态转移DP,统称线性DP。 线性DP最常见的有: 子集和问题,LIS问题,LCS问题。 拓展之后有:子段和问题,杂类问题。1. 子集和问题和硬币计数问题子集和问题的一个实例: 〈S,t〉。其中,... 阅读全文
摘要:
假设手里有N个串,和原文进行匹配,如果跑KMP,得把原文跑N次,实在是太费时间了。AC自动机借助于Trie的压缩功能,将多个串压成一个“树”,用这个树进行KMP,这就是贝尔实验室发明的AC自动机。AC自动机主要有三个操作;insert,getfail,print,find。insert的操作和Tri... 阅读全文
摘要:
字符串匹配广泛用于各类工程、研究。朴素的字符串匹配像极了两条履带,小的履带先和大的履带对齐,逐个验证上下是否一致。如果不一致,小的履带右移一格,继续上下比对。最坏复杂度是O(nm),实在难以让人满意。实际上,小履带没必要每次都从头开始和大履带匹配,假设小履带已经匹配了好多,失配后右移一位从头开始走,... 阅读全文
摘要:
string标准库固然强大,但是仍然有一些处理字符串的优秀数据结构。Trie(前缀树)就是其中之一,它通过在树上对不同字符串的相同字符只记录一次,来实现对多个字符串的"压缩":可以认为多个字符串被压成了一个超级大的字符串。int ch[10000][26],cnt[10000];int sz=1; ... 阅读全文
摘要:
Treap名字的来源:Tree+Heap,正如名字一样,就是一颗简单的BST,一坨堆的合体。BST的不平衡的根本原因在于基于左s; if(ch[1]!=NULL) s+=ch[1]->s; }}Treap的结点结构Treap的主操作由以下几部分构成:rotate、insert,... 阅读全文
摘要:
线段树与BST不同,它维护的是区间信息,树高越低,区间范围越大,而最后一层就是单点信息。线段树的价值于其维护的区间信息,如果不能有效利用,那么线段树就是一颗废树。一、单点更新线段树按照结点更新方式的不同,分为单点更新和成段更新。单点更新是线段树最简单的结构。通常由Push_Up, Build,Up... 阅读全文
摘要:
尽管堆优化的Prim用于处理稠密图不错,但是实际上很少有题目稠密图。所以一般直接上用并查集优化的Kruskal,简洁高效。int find(int x) {return x!=p[x]?p[x]=find(p[x]):x;}struct edge{ int u,v,c;}Edge[10001]... 阅读全文
摘要:
要说最短路,先来说说最长路,理解了最长路问题之后,才能透彻理解最短路的几个算法。最大化问题在线性结构、树型结构里面可以轻松构造无后效性的最优子结构解决,但是在图结构里面就很麻烦,原因是顺着一个点推下去之后,图结构中还存在另一个点亦可到达此点,可能推翻前面存的结果。所以要对整个图进行Relax。最短路... 阅读全文
摘要:
1. 最大流问题。实现t点流量最大。这是网络流的基本问题。通常三种方法,EK,Dinic,ISAP。EK最好拍,但是每次找增广路都要BFS一次实在伤不 起,Dinic加上各种神神优化才赶得上没优化的ISAP,弃之。ISAP难拍难理解,但是花点时间理解一下就好了,主要是当前弧优化和GAP优化比较难 理... 阅读全文
摘要:
1. 啥是二分图?严格点,就是把给出的N种可能配对关系拆成两边,假设是左、右俩边的话,如果一点无论怎么分,既得在左边,又得在右边,那么这就不是二分图了。 我们常见的题目通常是给出俩类不同的东西配对,比如男女配对(男1~N,女1~N),这样绝对不会出现男男配对这种情况,所以不需要检查是否构成二分图。 ... 阅读全文