ACM知识讲解
文章平均质量分 71
即为君子
忍把浮名,换了低斟浅唱。
展开
-
Manacher算法:求解最长回文字符串,时间复杂度为O(N)
回文串定义:“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。回文子串,顾名思义,即字符串中满足回文性质的子串。经常有一些题目围绕回文子串进行讨论,比如POJ3974最长回文,求最长回文子串的长度。朴素算法是依次以每一个字符为中心向两侧进行扩展,显然这个复杂度是O(N^2)的,关于字符串的题目常用的算法有KMP、后缀数组、AC 自动转载 2017-04-12 21:39:31 · 420 阅读 · 0 评论 -
sg函数和sg定理
在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧.必胜点和必败点的概念: P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败。 N点:必胜点,处于此情况下,双方操作均正确的情况下必胜。必胜点和必败点的性质: 1、所有终结点是 必败点 P 。(我们以此为基本前提进行推理,换句话说,我们以此为假设) 2、从任何必胜点N ...转载 2018-04-28 21:31:12 · 1035 阅读 · 1 评论 -
小球放入盒中的方法总结(排列组合)
本篇博客主要讲解球盒模型问题中所有情况,因为该问题是组合数学中的最常见的一类问题,所以有必要在这里详细地说一说。该类问题涉及到三个因素,分别是球、盒子、盒子是否可以为空。所以大概可以将该问题分为以下八种情况:1.将r个无区别的球放入n个有标志的盒中,盒内数目无限制,有多少种情况?2.将r个有区别的球放入n个有标志的盒中,没有一个盒子为空,有多少种情况?3.将r个无区别的球放入n个有标志的盒中,没有...转载 2018-04-02 10:50:18 · 9538 阅读 · 0 评论 -
最长上升子数列
1 LIS什么是最长递增子序列呢? 2 问题描述如下: 3 设L=是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=, 4 其中k1akm。求最大的m值。 5 对于这个问题有以下几种解决思路: 6 1、把a1,a2,...,an排序,假设得到a'1,a'2,...,a'n,然后求a的a'的最长公共子串,这样总的时间复杂度为o(nlg(n))+o(n^2)转载 2017-03-05 21:21:33 · 416 阅读 · 0 评论 -
计算一个矩阵从左上角到右下角和最大(DFS)
有一个M行N列的矩阵,其中部分格子里面有一些有价值的物品。 现在你从左上角出发,每次只能想右或者向下走。 走到右下角的时候,你能获取的物品的总价值最大有多少? 输入数据: 第一行有两个数字M N,表示这个矩阵有M行N列。 然后从第二行开始,有M行整数,每行都有N个非负整数,表示这一格的物品价值。 输出数据: 可以获取的最大的物品总价值 数据范围:0, 矩阵中的字数不转载 2017-04-25 21:23:06 · 1460 阅读 · 1 评论 -
acm博弈论讲解
序:博弈是信息学和数学试题中常会出现的一种类型,算法灵活多变是其最大特点,而其中有一类试题更是完全无法用常见的博弈树来进行解答。 寻找必败态即为针对此类试题给出一种解题思路。此类问题一般有如下特点:1、博弈模型为两人轮流决策的非合作博弈。即两人轮流进行决策,并且两人都使用最优策略来获取胜利。2、博弈是有限的。即无论两人怎样决策,都会在有限步后决出胜负。转载 2017-04-23 23:15:04 · 326 阅读 · 0 评论 -
KMP算法详解
本文由简单的字符串匹配算法开始,经Rabin-Karp算法,最后到KMP算法,教你从头到尾彻底理解KMP算法。来看算法导论一书上关于此字符串问题的定义:假设文本是一个长度为n的数组T[1...n],模式是一个长度为m进一步假设P和T的元素都是属于有限字母表Σ.中的字符。依据上图,再来解释下字符串匹配问题。目标是找出所有在文本T=abcabaabcaabac中的模式P转载 2017-07-27 10:50:22 · 263 阅读 · 0 评论 -
C++ STL基本容器的使用
C++中有两种类型的容器:顺序容器和关联容器。顺序容器主要有vector、list、deque等。其中vector表示一段连续的内存,基于数组实现,list表示非连续的内存,基于链表实现,deque与vector类似,但是对首元素提供插入和删除的双向支持。关联容器主要有map和set。map是key-value形式,set是单值。map和set只能存放唯一的key,multimap和multise转载 2017-05-15 21:41:23 · 239 阅读 · 0 评论 -
DFS(深搜)算法解析
图是一种灵活的数据结构,一般作为一种模型用来定义对象之间的关系或联系。对象由顶点(V)表示,而对象之间的关系或者关联则通过图的边(E)来表示。 图可以分为有向图和无向图,一般用G=(V,E)来表示图。经常用邻接矩阵或者邻接表来描述一副图。 在图的基本算法中,最初需要接触的就是图的遍历算法,根据访问节点的顺序,可分为广度优先搜索(BFS)和深度优先搜索(DFS)。广度优先搜索(BFS)转载 2017-04-28 20:41:17 · 42558 阅读 · 2 评论 -
欧几里得与扩展欧几里得
欧几里德算法欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。第一种证明: a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而转载 2017-01-24 18:20:02 · 190 阅读 · 0 评论 -
背包问题
01背包问题,是用来介绍动态规划算法最经典的例子,网上关于01背包问题的讲解也很多,我写这篇文章力争做到用最简单的方式,最少的公式把01背包问题讲解透彻。01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] }f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。Pi转载 2017-02-06 20:41:55 · 326 阅读 · 0 评论 -
两类背包问题
背包之01背包、完全背包、多重背包详解首先说下动态规划,动态规划这东西就和递归一样,只能找局部关系,若想全部列出来,是很难的,比如汉诺塔。你可以说先把除最后一层的其他所有层都移动到2,再把最后一层移动到3,最后再把其余的从2移动到3,这是一个直观的关系,但是想列举出来是很难的,也许当层数n=3时还可以模拟下,再大一些就不可能了,所以,诸如递归,动态规划之类的,不能细想,只能找局部关系。转载 2017-02-08 17:04:07 · 384 阅读 · 0 评论 -
扩展欧几里得模板题
Modular InverseTime Limit: 2 Seconds Memory Limit: 65536 KBThe modular modular multiplicative inverse of an integer a modulo m is an integer x such that a-1≡x (mod m). This is equivalent转载 2017-02-15 20:21:58 · 502 阅读 · 0 评论 -
快速幂和素数筛
快速幂:long long int text(long long int a,long long int b,long long int c){ long long int ans=1; a=a%c; while(b>0) { if(b%2==1) ans=(ans*a)%c; b/=2;转载 2017-03-05 19:22:04 · 238 阅读 · 0 评论 -
NIMK博弈
普通的NIM游戏是在n堆石子中每次选一堆,取任意个石子,而NIMK游戏是在n堆石子中每次选择k堆,1<=k<=n,从这k堆中每堆里都取出任意数目的石子,取的石子数可以不同,其他规则相同。对于普通的NIM游戏,我们采取的是对每堆的SG值进行异或,异或其实就是对每一个SG值二进制位上的数求和然后模2,比如说3^5就是011+101=112,然后对每一位都模2就变成了110,所以3^5=6。...转载 2018-04-29 21:21:12 · 758 阅读 · 0 评论