摘要:普通做法是O(n^2)下面介绍:最长上升子序列O(nlogn)算法(http://blog.csdn.net/shuangde800/article/details/7474903)
阅读全文
摘要:4 6 11 2 201 3 54 1 -2002 4 44 2 43 4 2 和: 4 6 11 2 21 3 54 1 102 4 44 2 43 4 2
阅读全文
摘要:int c[N];//c[u]=0表示从来没有访问过;c[u]=1表示已经访问过,并且还递归访问过它的所有子;c[u]=-1表示正在访问。 int topo[N],t; int G[N][N]; bool dfs(int u) { c[u]=-1; for(int v=0;v<n;v++) if(G[u][v]) { if(c[v]<0) retu...
阅读全文
摘要:/* Dijkstra的算法思想: 在所有没有访问过的结点中选出dis(s,x)值最小的x 对从x出发的所有边(x,y),更新 dis(s,y)=min(dis(s,y),dis(s,x)+dis(x,y)) */ #include #include #include #include using namespace std; const int Ni = 10000; const in...
阅读全文
摘要:3个重要结论: 最小点覆盖数: 最小覆盖要求用最少的点(X集合或Y集合的都行)让每条边都至少和其中一个点关联。可以证明:最少的点(即覆盖数)=最大匹配数最小路径覆盖=最小路径覆盖=|N|-最大匹配数用尽量少的不相交简单路径覆盖有向无环图G的所有结点。解决此类问题可以建立一个二分图模型。把所有顶点i拆
阅读全文
摘要:欧几里德算法又称辗转相除法,用于计算两个整数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的一
阅读全文
摘要:首先维护的是两个栈,我们这里暂且称为S1和S2,S1中的结果最后存的就是逆波兰表达式,S2中将用于暂时存放运算符并且在最终形成逆波兰表达式的时候,该栈是会清空的。下面我们看看怎样具体的形成逆波兰表达式。 在此首先定义一下运算符的优先级关系,从小到达排序,相同优先级没有用逗号隔开:(,+-,*\,负号
阅读全文
摘要:#include #include #include using namespace std; int a[10]={2,1,5,9,8,7,6,4,3,10}; void Swap(int i,int j) { int x=a[i]; a[i]=a[j]; a[j]=x; return ; } int Partition(int p,int r) { ...
阅读全文
摘要:C++ STL 优先队列详解 一.解释: 优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序,每次的push和pop操作,队列都会动态的调整,以达到我们预期的方式来存储。 例如,将元素5 3 2 4 6依次push到优先队列中,规定顺序为从大到小并输出
阅读全文
摘要:深度优先搜索(DFS,Depth-First Search)是搜索手段之一。它从某个状态开始,不断的转移状态知道无法转移,然后退回到前一步的状态,继续转移到其他状态,如此不断重复,直到找到最终的解。 问题给定整数a1,a2...an,判断是否可以从中选出若干数,使它们的和恰好为k。 1<=n<=20
阅读全文
摘要:int next[N]; char S[N], T[N]; int slen, tlen; void getNext() { int j, k; j = 0; k = -1; next[0] = -1; while(j < tlen) if(k == -1 || T[j] == T[k]) next
阅读全文
摘要:void merge(int l,int r){ int left[N],right[N]; int mid=(l+r)/2; int m=0,n=0; for(int i=l;i<=mid;i++) //左半部分 left[m++]=a[i]; for(int i=mid+1;i<=r;i++)
阅读全文
摘要:int Eular(int n){ int s=n; for(int i=2;i*i<=n;i++){ if(n%i==0) s=s/i*(i-1); while(n%i==0) n/=i; } if(n>1) s=s/n*(n-1); return s;}
阅读全文
摘要:刚刚接触到sg函数突然感觉到原来可以这么好用,sg函数应该算是博弈论中比较经典的东西了。下面来说说sg函数: 从网上搜集资料终于能看懂了下面解释来自http://www.cnblogs.com/cj695/archive/2012/07/31/2617378.html,自己写不出来收藏了大神的思想。
阅读全文
摘要:int s(int l,int r,int k)//二分查找 76 { 77 int mid; 78 while(l>1; 81 if(kx[mid]) l=mid+1; 83 else return mid; 84 } 85 return -1; 86 }
阅读全文
摘要:1.nth_element():找到第几大的数。用法:nth_element(a,a+k,a+n),返回一个数组a中第k大的数,时间复杂度比较小,头文件#include <algorithm>。 2.lower_bound()。函数lower_bound()在first和last中的前闭后开区间进行
阅读全文