算法
DS_HY
这个作者很懒,什么都没留下…
展开
-
超大背包
点击打开链接edf 困到不行。。。不想动弹就想在机房睡觉了,,今晚上cf怕是打不了了。。。存一波,清醒的时候看原创 2017-05-15 22:30:41 · 220 阅读 · 0 评论 -
UVALIVE 3026 Period(kmp)
思路:KMP算法。还记得KMP算法中next数组的含义吗。假设next[i]=x,就表明字符串前i个字符的子串中前x个字符和后x个字符是完全相同的。对于一个周期串来说,假设它的长度是len,最小周期是p,那么它的前len-p个字符和后len-p个字符是完全相同的。那么我们只需要求一次next数组,就可以掌握字符串的所有前缀的周期情况了。这里的next的求法就是最原始的那种,没有优化原创 2017-07-11 00:19:38 · 168 阅读 · 0 评论 -
KMP(字符串匹配)
说实话 ,看了大佬的讲解十分清晰,但是,,代码的实现部分还是表示不太理解他;缺少实践;不过这个博客讲的挺不错的 点击打开链接原创 2017-07-10 18:40:35 · 220 阅读 · 0 评论 -
容斥简述
先上容斥原理的百科定义。。在计数时,必须注意没有重复,没有遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。。。(好吧我错了,不应该上这个的,额,那就再任性一点来个更抽象的)公式在原创 2017-07-18 21:48:59 · 338 阅读 · 2 评论 -
枚举子集方法
枚举子集的3种方式 -- C++描述要求: 给定一个集合,枚举所有可能的子集。此处的集合是不包含重复元素的。 Method0: 增量构造法 思路:每次选取一个元素至集合中,为了避免枚举重复的集合,此处要采用定序技巧 -- 除了第一个元素,每次选取必须要比集合中的前一个元素要大! 123456789转载 2017-08-08 14:14:21 · 2571 阅读 · 0 评论 -
滑动窗口
(转)题目描述给定一个数组A[],有一个大小为w的滑动窗口,该滑动窗口从最左边滑到最后边。在该窗口中你只能看到w个数字,每次只能移动一个位置。我们的目的是找到每个窗口w个数字中的最大值,并将这些最大值存储在数组B中。例如数组A=[1 3 -1 -3 5 3 6 7], 窗口大小w为3。则窗口滑动过程如下所示:Window position Ma转载 2017-08-08 18:57:23 · 164 阅读 · 0 评论 -
线段树 1(基础 单点更新)
首推一个博客点击打开链接;还有这个点击打开链接;一 概述线段树,类似区间树,它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,它基本能保持每个操作的复杂度为O(logn)。线段树的每个节点表示一个区间,子节点则分别表示父节点的左右半区间,例如父亲的区间是[a,b],那么(c=(a+b)/2)左儿子的区间是[a,c原创 2017-08-11 16:51:40 · 227 阅读 · 0 评论 -
线段树2(区间更新)
区间更新是指更新某个区间内的叶子节点的值,因为涉及到的叶子节点不止一个,而叶子节点会影响其相应的非叶父节点,那么回溯需要更新的非叶子节点也会有很多,如果一次性更新完,操作的时间复杂度肯定不是O(lgn),例如当我们要更新区间[0,3]内的叶子节点时,需要更新出了叶子节点3,9外的所有其他节点。为此引入了线段树中的延迟标记概念,这也是线段树的精华所在。延迟标记:每个节点新增加一个标记,记录这个节原创 2017-08-12 11:18:28 · 196 阅读 · 0 评论 -
树形数组(一脸蒙蔽)
一脸懵逼 ,并不是很懂点击打开链接s 不懂原创 2017-04-12 22:18:01 · 305 阅读 · 0 评论 -
树状数组
结合这两个博客看懂的:点击打开链接点击打开链接‘关于树状数组的实现 数据结构 - 树状数组 ( Binary Indexed Tree,BIT,二分索引树 ),它只有两种基本操作,并且都是操作线性表的数据的: 1、add( i, 1 ) (1 2、sum( i ) (1 试想一下,如果原创 2017-08-13 17:40:04 · 156 阅读 · 0 评论 -
最小k限度生成树 +poj(1639)代码
算法引入: 最小k度限制生成树,就是指有特殊的某一点的度不能超过k时的最小生成树; 如果T是G的一个生成树且dT(v0)=k,则称T为G的k度限制生成树; G中权值和最小的k度限制生成树称为G的最小k度生成树; 算法思想: 设特殊的那点为v0,先把v0删除,求出剩下连通图的所有最小生成树; 假如有m棵最小生成树,那么这些生成树必定要跟v0点相连; 也就是说这棵生成原创 2017-08-07 14:08:05 · 691 阅读 · 0 评论 -
HDU6162(树链剖分)
难受,翻了各种傻逼错误,导致现在才改完(函数没return,样例忘了换行,多余输出忘了删,估计是太晚了,脑子已经瓦特了),,,,昨天是2018WF 莫斯科拿了一个冠军一个亚军,北大主场拿了季军。这是一个树链剖分裸题,但是以前没看过,还比较简单,来几个博客点击打开链接;点击打开链接;;此题借鉴点击打开链接#include<iostream>#include<cstdio>...原创 2018-04-20 00:59:01 · 400 阅读 · 0 评论 -
dancing links(待补。。。。。)
好困难啊,很久以前就想看,没看的一个,比以前看到感觉好一点,但是还是决定以后再看。。。模板代码表示还无法完全理解(引用一个大神的博客)浅入 dancing links x(舞蹈链算法)abastract:利用dancing links 解决精确覆盖问题,例如数独,n皇后问题;以及重复覆盖问题。要学习dacning links 算法,首先要先了解该算法适用的问题,精确原创 2017-05-25 19:10:54 · 420 阅读 · 0 评论 -
欧拉回路(dfs 。。。。。等会补fleury算法:)
若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径。若该路径是一个圈,则称为欧拉(Euler)回路。具有欧拉回路的图称为欧拉图(简称E图)。具有欧拉路径但不具有欧拉回路的图称为半欧拉图以下判断基于此图的基图连通。无向图存在欧拉回路的充要条件一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。有向图存在欧拉回路的充要条原创 2017-05-24 22:13:35 · 2103 阅读 · 1 评论 -
poj 3040Allowance_可以付多少周工资 (贪心)
题目点击打开链接然后题意:有n种面额的硬币。且面值大的一定能被面值小的整除。现告诉你每种面值硬币的个数。和一个值c。每周支出的钱必须大于等于c。问钱最多能用多少周。思路:贪心。大概都能想到。关键是如何寻找最优策略。对于面值大于c的硬币自然不用说。一枚用一周。对于面值小于c的硬币。我们先考虑一个c的方案。要使用的周数最多我们应该就要使钱的利用率最大。也就是说损失的钱最原创 2017-04-19 20:17:10 · 1055 阅读 · 0 评论 -
next_permutation
1 2 3的全排列#include #include #includeusing namespace std;int main(){ int b[4]={0,1,2,3}; for(int i=1;i { for(int j=1;j cout cout原创 2017-03-19 21:39:22 · 137 阅读 · 0 评论 -
图着色问题(1.二分图)
对于输入一个图,能否用两个颜色将节点涂色,要求相邻的节点的颜色不一样;#include #include#includeusing namespace std;const int maxn=100000;vector g[maxn];//图 每个节点的相邻节点int v; //顶点数int color[maxn];//顶点的颜色-1,1,0bool dfs(int原创 2017-03-27 16:44:55 · 1155 阅读 · 0 评论 -
图着色问题(2.m色)
1,已知一个图g和m>0种颜色,在只准使用这m种颜色对g的结点着色的情况下,是否能使图中任何相邻的两个结点都具有不同的颜色呢?这个问题称为m-着色判定问题。2,在m-着色最优化问题则是求可对图g着色的最小整数m。这个整数称为图g的色数。这是求图的最少着色问题,求出m的值。题目的解法:第一个问题,m-着色判定问题:可以通过回溯的方法,不断的为每一个节点着色,在前面n-1个节点都合法的原创 2017-03-27 19:09:28 · 1476 阅读 · 1 评论 -
二分法
原博客地址点击打开链接关于二分查找法二分查找法主要是解决在“一堆数中找出指定的数”这类问题。而想要应用二分查找法,这“一堆数”必须有一下特征:存储在数组中有序排列所以如果是用链表存储的,就无法在其上应用二分查找法了。(曽在面试被问二分查找法可以什么数据结构上使用:数组?链表?)至于是顺序递增排列还是递减排列,数组中是否存在相同的元素都不要紧。不过一般情况转载 2017-03-13 19:13:20 · 233 阅读 · 0 评论 -
bfs
#include #includeusing namespace std;const int maxn=100+5;const int INF=1000000000;int sy,sx,gx,gy;int d[maxn][maxn];char maze[maxn][maxn];int m,n;int dx[4]={1,0,-1,0},dy[4]={0,1原创 2017-03-14 09:41:31 · 143 阅读 · 0 评论 -
NP 和P问题
这是偶然之间得知的一个比较有趣的词,搜索了一下之后发现这是一个比较6的问题P/NP问题是在理论信息学中计算复杂度理论领域里至今没有解决的问题,它也是克雷数学研究所七个千禧年大奖难题之一。P/NP问题中包含了复杂度类 ,P与NP的关系。一看上面这句话我就很兴奋,但是理解力还是略有欠缺所以在这里引用大牛的言论。 1. ”NP”的全称为“Nondeterministic Po原创 2017-04-10 11:43:35 · 594 阅读 · 1 评论 -
广度/宽度优先搜索(BFS)
引用一个大神的博客 ,点击打开链接上面经典例题是一个迷宫问题 S表示起点,G表示终点,#表示墙壁, . 表示路,求最短距离5 5S####..#..#...##....#G####include #includeusing namespace std;const int maxn=100+5;const int INF=10原创 2017-03-15 16:18:47 · 238 阅读 · 0 评论 -
贪心算法
所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。 所以对所采用的贪心策略一定要原创 2017-03-15 20:56:44 · 235 阅读 · 0 评论 -
poj 1458Common Subsequence (dp)
Common SubsequenceTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 50877 Accepted: 20958DescriptionA subsequence of a given sequence is the given sequenc原创 2017-03-20 19:59:22 · 207 阅读 · 0 评论 -
动态规划之简单背包问题
简单背包 输入一个物体数n,再输入n组数据,物体重量和背包价值,最后输入背包容量42 31 23 42 25方法一先用了一个递归,会有重复问题,所以用了一个dp去储存来减低循环数目;#include using namespace std;const int maxn=1000+5;int n,m;int dp[maxn][maxn];int w[原创 2017-03-16 09:12:33 · 297 阅读 · 0 评论 -
划分数(3题)
引用一个博客点击打开链接看看题目第一题:1269: 划分数Time Limit: 1 Sec Memory Limit: 128 MB[Submit][Status][Web Board]Problem Description将整数n分成m份,求划分的种数,注意每份不为空,不考虑顺序。比如整数4的划分,1 1 2 和 1 2 1 以及2原创 2017-04-01 17:03:51 · 729 阅读 · 0 评论 -
呀吧 三分
嗯哼借用一下看的人家的博客点击打开链接一. 概念在二分查找的基础上,在右区间(或左区间)再进行一次二分,这样的查找算法称为三分查找,也就是三分法。三分查找通常用来迅速确定最值。二分查找所面向的搜索序列的要求是:具有单调性(不一定严格单调);没有单调性的序列不是使用二分查找。与二分查找不同的是,三分法所面向的搜索序列的要求是:序列为一个凸性函数。通俗来讲,就是该序列必原创 2017-04-01 18:48:08 · 220 阅读 · 0 评论 -
查并集模板
int par[maxn];int rank[maxn];void init(int n){ for(int i=0;i<n;i++) { par[i]=i; rank[i]=0; }}int find(int x){ if(par[x]==x) return x; else return原创 2017-03-27 00:19:06 · 331 阅读 · 0 评论 -
二叉树的三种先序后序中序遍历的互相推出(例UVA 536 - Tree Recovery)
关于树的先序中序后序遍历由先序中序推后序因为 先序:根 左 右 中序:左 根 右 后序:右 根 左根据他们的对应关系推出树1,先序遍历 中序遍历推后序遍历:#include #include#include#includeusing namespace std;const int maxn=50;void tree(int原创 2017-04-29 21:21:31 · 397 阅读 · 0 评论 -
最短路径
哈哈 点击打开链接OK,现在来总结一下刚才的算法。算法的基本思想是:每次找到离源点(上面例子的源点就是 1 号顶点)最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径。基本步骤如下:将所有的顶点分为两部分:已知最短路程的顶点集合 P 和未知最短路径的顶点集合 Q。最开始,已知最短路径的顶点集合 P 中只有源点一个顶点。我们这里用一个 bo转载 2017-03-18 18:55:42 · 333 阅读 · 0 评论