算法总结3篇 基本算法语句总结

时间:2022-10-11 12:41:18 工作总结

  下面是范文网小编收集的算法总结3篇 基本算法语句总结,供大家参阅。

算法总结3篇 基本算法语句总结

算法总结1

  源程序代码:

}

  一、自然数拆分(递归)

} #include<>

  二、快速排序(递归)int a[100];void spilt(int t)#include<> { int k,j,l,i;main()for(k=1;k<=t;k++){int i,a[11]={0,14,12,5,6,32,8,9,15,7,10};{ printf(“%d+”,a[k]);} for(i=0;i<11;printf(“%4d”,a[i]),++i);printf(“n”);printf(“n”);j=t;l=a[j];quicksort(a,10);for(i=a[j-1];i<=l/2;i++)for(i=0;i<11;printf(“%4d”,a[i]),++i);{ a[j]=i;a[j+1]=l-i;printf(“n”);}

  spilt(j+1);} } int partitions(int a[],int from,int to)void main(){ { int n,i;

  int value=a[from];printf(“please enter the number:”);

  while(from

  a[from]=a[to];

  while(from

++from;

  a[to]=a[from];

}

  a[from]=value;

  return from;

}

  void qsort(int a[],int from,int to){ int pivottag;if(from

{pivottag=partitions(a,from,to);qsort(a,from,pivottag-1);qsort(a,pivottag+1,to);

} scanf(“%d”,&n);

  for(i=1;i<=n/2;i++){ a[1]=i;a[2]=n-i;spilt(2);

  三、删数字(贪心)

#include<> #include<> void main(){

  int a[11]={3,0,0,0,9,8,1,4,7,5,1};

  int k=0,i=0,j;

  int m;

  while(i<11)

{

  printf(“%d ”,a[i]);

  i++;}

  printf(“n please input delete number:”);

  四、全排列(递归)#include<> A(char a[],int k,int n){

  int i;char temp;if(k==n)

  for(i=0;i<=3;i++)

{printf(“%c ”,a[i]);} else {

  for(i=k;i<=n;i++)

{ temp=a[i];

  a[i]=a[k];

  a[k]=temp;

  a(a,k+1,n);

} } } main(){

  int n;

  char a[4]={'a','b','c','d'},temp;

  a(a,0,3);

  getch();

  return 0;}

  五、多段图(动态规划)#include “”

#define n 12 //图的顶点数

{ while(from=value)--to;

  scanf(“%d”,&m);for(k=0;k

{

  for(i=0;i<=11-k;i++)

{

  if(a[i]>a[i+1])

{

  for(j=i;j<10;j++)

{a[j]=a[j+1];}

  break;//满足条件就跳转

}

} }

  int quicksort(int a[],int n){

  qsort(a,0,n);}

}

  printf(“the change numbers:”);

  for(i=0;i<11-m;i++)

{

  if(a[i]!=0)

{ printf(“%d ”,a[i]);}

}

}

#define k 4 //图的段数 #define MAX int cost[n][n];//成本值数组

  int path[k];//存储最短路径的数组

  void creatgraph()//创建图的(成本)邻接矩阵 { int i,j;

  for(i=0;i

  for(j=0;j

  scanf(“%d”,&cost[i][j]);//获取成本矩阵数据 }

  void printgraph()//输出图的成本矩阵 { int i,j;

  printf(“成本矩阵:n”);

  for(i=0;i

{ for(j=0;j

  printf(“%d ”,cost[i][j]);

  printf(“n”);

} }

//使用向前递推算法求多段图的最短路径 void FrontPath(){ int i,j,length,temp,v[n],d[n];

  for(i=0;i

  v[i]=0;for(i=n-2;i>=0;i--){ for(length=MAX,j=i+1;j<=n-1;j++)

  if(cost[i][j]>0 &&(cost[i][j])+v[j]

{length=cost[i][j]+v[j];temp=j;}

  v[i]=length;

  d[i]=temp;

}

  path[0]=0;//起点

  path[k-1]=n-1;//最后的目标

  for(i=1;i<=k-2;i++)(path[i])=d[path[i-1]];//将最短路径存入数组中 }

//使用向后递推算法求多段图的最短路径

  void BackPath(){ int i,j,length,temp,v[n],d[n];

  for(i=0;i

  for(i=1;i<=n-1;i++)

{ for(length=MAX,j=i-1;j>=0;j--)

  if(cost[j][i]>0 &&(cost[j][i])+v[j]

{length=cost[j][i]+v[j];temp=j;}

  v[i]=length;

  d[i]=temp;

}

  path[0]=0;

  path[k-1]=n-1;

  for(i=k-2;i>=1;i--)(path[i])=d[path[i+1]];}

//输出最短路径序列 void printpath(){ int i;

  for(i=0;i

  printf(“%d ”,path[i]);}

  main(){ freopen(“E:”,“r”,stdin);

  creatgraph();

  printgraph();

  frontPath();

  printf(“输出使用向前递推算法所得的最短路径:n”);

  printpath();

  printf(“n输出使用向后递推算法所得的最短路径:n”);

  backPath();

  printpath();printf(“n”);}

  六、背包问题(递归)int knap(int m, int n){

  int x;

  x=m-mn;

  if x>0

  sign=1;

  else if x==0

  sign=0;

  else

  sign=-1;

  switch(sign){

  case 0: knap=1;break;

  case 1: if(n>1)

  if knap(m-mn,n-1)

  knap=1;

  else

  knap= knap(m,n-1);

  else

  knap=0;

  case-1: if(n>1)

  knap= knap(m,n-1);

  else

  knap=0;

} }

  七、8皇后(回溯)#include <> #include <> #define N 4 int place(int k, int X[N+1]){

  int i;

  i=1;

  while(i

  if((X[i]==X[k])||(abs(X[i]-X[k])==abs(i-k)))

  return 0;

  i++;

}

  return 1;}

  void Nqueens(int X[N+1]){

  int k, i;

  x[1]=0;k=1;

  while(k>0){

  x[k]=X[k]+1;

  while((X[k]<=N)&&(!place(k,X)))

  x[k]=X[k]+1;

  if(X[k]<=N)

  if(k==N){ for(i=1;i<=N;i++)

  printf(“%3d”,X[i]);printf(“n”);

}

  else{ k=k+1;

  x[k]=0;

}

  else k=k-1;

} }

  void main(){

  int n, i;

  int X[N+1]={0};

  clrscr();

  Nqueens(X);

  printf(“The end!”);}

  八、图着色(回溯)#include<> #define N 5 int X[N]={0,0,0,0,0};int GRAPH[N][N]={ {0,1,1,1,0},{1,0,1,1,1},{1,1,0,1,0},{1,1,1,0,1},{0,1,0,1,0} };int M=4;int count=0;int mcoloring(int k){

  int j,t;

  while(1){

  NextValue(k);

  if(X[k]==0)

  return 0;

  if(k==(N-1)){

  for(t=0;t

  printf(“%3d”,X[t]);

  printf(“n”);

  count++;

}

  else

  mcoloring(k+1);

} } int nextValue(int k){

  int j;

  while(1){

  x[k]=(X[k]+1)%(M+1);

  if(X[k]==0)

  return 0;

  for(j=0;j

  if((GRAPH[k][j]==1)&&(X[k]==X[j]))

  break;

}

  if(j==N){

  return 0;

}

} } void main(){

  int k;

  clrscr();

  k=0;

  mcoloring(k);

  printf(“ncount=%dn”,count);}

  矩阵链乘法(动态规划)? 符号S[i, j]的意义:

  符号S(i, j)表示,使得下列公式右边取最小值的那个k值

  public static void matrixChain(int [ ] p, int [ ][ ] m, int [ ][ ] s)

{

  int n=;

  for(int i = 1;i <= n;i++)m[i][i] = 0;

  for(int r = 2;r <= n;r++)

  for(int i = 1;i <= n-r+1;i++){

  int j=i+r-1;

  m[i][j] = m[i+1][j]+ p[i-1]*p[i]*p[j];

  s[i][j] = i;

  for(int k = i+1;k < j;k++){

  int t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];

  if(t < m[i][j]){

  m[i][j] = t;

  s[i][j] = k;}

}

}

}

  O的定义:

  如果存在两个正常数c和n0,对于所有的n≥n0时,有:

  |f(n)|≤c|g(n)|,称函数f(n)当n充分大时的阶比g(n)低,记为

  f(n)=O(g(n))。计算时间f(n)的一个上界函数 Ω的定义:

  如果存在正常数c和n0,对于所有n≥n0时,有:

  |f(n)|≥c|g(n)|,则称函数f(n)当n充分大时下有界,且g(n)是它的一个下界,即f(n)的阶不低于g(n)的阶。记为:

  f(n)=Ω(g(n))。Θ的定义:

  如果存在正常数c1,c2和n0,对于所有的n>n0,有:

  c1|g(n)|≤f(n)≤c2|g(n)|,则记f(n)=Θ(g(n))意味着该算法在最好和最坏的情况下计算时间就一个常因子范围内而言是相同的。(1)多项式时间算法:

  O(1)

(2)指数时间算法:

  O(2n)

  move(n,n+1)(2n+1,2n+2)move(2n-1,2n)(n,n+1)call chess(n-1)

  贪心方法基本思想:

  贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择

  所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。

  多段图:

  cOST[j]=c(j,r)+COST[r];

  回溯法:

(假定集合Si的大小是mi)不断地用修改过的规范函数Pi(x1,…,xi)去测试正在构造中的n-元组的部分向量(x1,…,xi),看其是否可能导致最优解。如果判定(x1,…,xi)不可能导致最优解,那么就将可能要测试的mi+1…mn个向量略去。约束条件:

(1)显式约束:限定每一个xi只能从给定的集合Si上取值。

(2)解

  空

  间:对于问题的一个实例,解向量满足显式

  约束条件的所有多元组,构成了该实例

  的一个解空间。

(3)隐式约束:规定解空间中实际上满足规范函数的元

  组,描述了xi必须彼此相关的情况。基本做法:

  在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解:如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。

  8皇后问题

  约束条件

  限界函数:

  子集和数问题:

  约束条件

  限界函数:

  回溯法--术语:

  活结点:已生成一个结点而它的所有儿子结点还没有

  全部生成的结点称为活结点。

  e-结点:当前正在生成其儿子结点的活结点叫E-结点。

  死结点:不再进一步扩展或其儿子结点已全部生成的结点称为死结点。

  使用限界函数的深度优先节点生成的方法成为回溯法;E-结点一直保持到死为止的状态生成的方法 称之为分支限界方法

  且用限界函数帮助避免生成不包含答案结点子树的状态空间的检索方法。区别:

  分支限界法本质上就是含有剪枝的回溯法,根据递归的条件不同,是有不同的时间复杂度的。

  回溯法深度优先搜索堆栈或节点的所有子节点被遍历后才被从栈中弹出找出满足约束条件的所有解

  分支限界法广度优先或最小消耗优先搜索队列,优先队列每个结点只有一次成为活结点的机会找出满足约束条件下的一个解或特定意义下的最优解

  一般如果只考虑时间复杂度二者都是指数级别的

  可是因为分支限界法存在着各种剪枝,用起来时间还是很快的int M, W[10],X[10];void sumofsub(int s, int k, int r){

  int j;

  x[k]=1;

  if(s+W[k]==M){

  for(j=1;j<=k;j++)

  printf(“%d ”,X[j]);

  printf(“n”);

}

  else

  if((s+W[k]+W[k+1])<=M){

  sumofsub(s+W[k],k+1,r-W[k]);

}

  if((s+r-W[k]>=M)&&(s+W[k+1]<=M)){

  x[k]=0;

  sumofsub(s,k+1,r-W[k]);

} } void main(){

  m=30;

  w[1]=15;

  w[2]=9;

  w[3]=8;

  w[4]=7;

  w[5]=6;

  w[6]=5;

  w[7]=4;

  w[8]=3;

  w[9]=2;

  w[10]=1;

  sumofsub(0,1,60);}

  p是所有可在多项式时间内用确定算法求解的判定问题的集合。NP是所有可在多项式时间内用不确定算法求解的判定问题的集合 如果可满足星月化为一个问题L,则此问题L是NP-难度的。如果L是NP难度的且L NP,则此问题是NP-完全的

算法总结2

  1.去掉超链接的下画线: 在 //添加这句就行。 2.格式为:你需要添加下画线的文字 3.获取时间

  我们可以通过使用DataTime这个类来获取当前的时间。通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04)、时间(12:12:12)、日期+时间(2008-09-04 12:11:10)等。

//获取日期+时间

();

// 2008-9-4 20:02:10 ().ToString();

// 2008-9-4 20:12:12 //获取日期

().ToString();

// 2008年9月4日 ().ToString();

// 2008-9-4 (“yyyy-MM-dd”);

// 2008-09-04 ();

// 2008-9-4 0:00:00 //获取时间 ().ToString();

// 20:16:16 ().ToString();

// 20:16 (“hh:mm:ss”);

// 08:05:57 ();

// 20:33:50. //其他

().ToString();

// ***000 ().ToString();

// ***750 ().ToString();

// . ().ToString();

// 2008-9-4 12:19:14 ();

  获取年份

// 2008 ();

  获取月份

// 9 ();获取星期

// Thursday ();获取第几天

// 248 ();

  获取小时

// 20 ();

  获取分钟

// 31 ();

  获取秒数

// 45 //n为一个数,可以数整数,也可以事小数 (n).ToString();

//时间加n年 (n).ToString();

//加n天 (n).ToString();

//加n小时 (n).ToString();

//加n个月 (n).ToString();

//加n秒 (n).ToString();

//加n分 SQL语句使用时间和日期的函数

  getdate():获取系统当前时间

  dateadd(datepart,number,date):计算在一个时间的基础上增加一个时间后的新时间值,比如:dateadd(yy,30,getdate())datediff(datepart,startdate,enddate):计算两个时间的差值,比如:datediff(yy,getdate(),'2008-08-08')dataname(datepart,date):获取时间不同部分的值,返回值为字符串 datepart(datepart,date):和datename相似,只是返回值为整型 day(date):获取指定时间的天数 month(date):获取指定时间的月份 year(date):获取指定时间的年份 select year(getdate()):当前年份

算法总结3

  算法分块总结

  为备战2005年11月4日成都一战,特将已经做过的题目按算法分块做一个全面详细的总结,主要突出算法思路,尽量选取有代表性的题目,尽量做到算法的全面性,不漏任何ACM可能涉及的算法思路。算法设计中,时刻都要牢记要减少冗余,要以简洁高效为追求目标。另外当遇到陌生的问题时,要想方设法进行模型简化,转化,转化成我们熟悉的东西。

  图论模型的应用

  分层图思想的应用:

  用此思想可以建立起更简洁、严谨的数学模型,进而很容易得到有效算法。重要的是,新建立的图有一些很好的性质: 由于层是由复制得到的,所以所有层都非常相似,以至于我们只要在逻辑上分出层的概念即可,根本不用在程序中进行新层的存储,甚至几乎不需要花时间去处理。由于层之间的相似性,很多计算结果都是相同的。所以我们只需对这些计算进行一次,把结果存起来,而不需要反复计算。如此看来,虽然看起来图变大了,但实际上问题的规模并没有变大。层之间是拓扑有序的。这也就意味着在层之间可以很容易实现递推等处理,为发现有效算法打下了良好的基础。

  这些特点说明这个分层图思想还是很有潜力的,尤其是各层有很多公共计算结果这一点,有可能大大消除冗余计算,进而降低算法时间复杂度。二分图最大及完备匹配的应用: ZOJ place the robots: 二分图最优匹配的应用:

  最大网络流算法的应用:典型应用就求图的最小割。最小费用最大流的应用:

  容量有上下界的最大流的应用:

  欧拉路以及欧拉回路的应用:主要利用求欧拉路的套圈算法。最小生成树:

  求最小生成树,比较常用的算法有Prim算法和Kruskal算法。前者借助Fibonacci堆可以使复杂度降为O(Vlog2V+E),后者一般应用于稀疏图,其时间复杂度为O(Elog2V)。最小K度限制生成树:

  抽象成数学模型就是:

  设G=(V,E,ω)是连通的无向图,v0 ∈V是特别指定的一个顶点,k为给定的一个正整数。首先考虑边界情况。先求出问题有解时k 的最小值:把v0点从图中删去后,图中可能会出 现m 个连通分量,而这m 个连通分量必须通过v0来连接,所以,在图G 的所有生成树中 dT(v0)≥m。也就是说,当k

  首先,将 v0和与之关联的边分别从图中删去,此时的图可能不再连通,对各个连通分量,分别求最小生成树。接着,对于每个连通分量V’,求一点v1,v1∈V’,且ω(v0,v1)=min{ω(v0,v’)|v’∈V’},则该连通分量通过边(v1,v0)与v0相连。于是,我们就得到了一个m度限制生成树,不难证明,这就是最小m度限制生成树。这一步的时间复杂度为O(Vlog2V+E)我们所求的树是无根树,为了解题的简便,把该树转化成以v0为根的有根树。

  假设已经得到了最小p度限制生成树,如何求最小p+1 度限制生成树呢?在原先的树中加入一条与v0相关联的边后,必定形成一个环。若想得到一棵p+1 度限制生成树,需删去一条在环上的且与v0无关联的边。删去的边的权值越大,则所得到的生成树的权值和就越小。动态规划就有了用武之地。设Best(v)为路径v0—v上与v0无关联且权值最大的边。定义father(v)为v的父结点,动态转移方程:Best(v)=max(Best(father(v)),(father(v),v)),边界条件为Best[v0]=-∞,Best[v’]=-∞|(v0,v’)∈E(T)。

  状态共|V|个,状态转移的时间复杂度O(1),所以总的时间复杂度为O(V)。故由最小p度限制生成树得到最小p+1度限制生成树的时间复杂度为O(V)。1 先求出最小m度限制生成树;

  2由最小m度限制生成树得到最小m+1度限制生成树;3 当dT(v0)=k时停止。

  加边和去边过程,利用动态规划优化特别值得注意。

  次小生成树:

  加边和去边很值得注意。

  每加入一条不在树上的边,总能形成一个环,只有删去环上的一条边,才能保证交换后仍然是生成树,而删去边的权值越大,新得到的生成树的权值和越小。具体做法:

  首先做一步预处理,求出树上每两个结点之间的路径上的权值最大的边,然后,枚举图中不在树上的边,有了刚才的预处理,我们就可以用O(1)的时间得到形成的环上的权值最大的边。如何预处理呢?因为这是一棵树,所以并不需要什么高深的算法,只要简单的BFS 即可。

  最短路径的应用:

  dijkstra 算法应用: Folyed 算法应用:

  bellman-Ford 算法的应用:

  差分约束系统的应用:

  搜索算法

  搜索对象和搜索顺序的选取最为重要。一些麻烦题,要注意利用数据有序化,要找一个较优的搜索出发点,凡是能用高效算法的地方尽量争取用高效算法。基本的递归回溯深搜,记忆化搜索,注意剪枝: 广搜(BFS)的应用: 枚举思想的应用: ZOJ 1252 island of logic A*算法的应用:

  iDA*算法的应用,以及跳跃式搜索探索: 限深搜索,限次: 迭代加深搜索:

  部分搜索+高效算法(比如二分匹配,动态规划): ZOJ milk bottle data: 剪枝优化探索:

  可行性剪枝,最优性剪枝,调整搜索顺序是常用的优化手段。

  动态规划

  动态规划最重要的就是状态的选取,以及状态转移方程,另外还要考虑高效的预处理(以便更好更快的实现状态转移)。最常用的思想就是用枚举最后一次操作。

  状态压缩DP,又叫带集合的动态规划:题目特点是有一维的维数特别小。类似TSP问题的DP:

  状态划分比较困难的题目: 树形DP:

  四边形不等式的应用探索:四边形不等式通常应用是把O(n^3)复杂度O(n^2)

  高档数据结构的应用

  并查集的应用:

  巧用并查集中的路径压缩思想: 堆的利用: 线段树的应用:

  总结用线段树解题的方法

  根据题目要求将一个区间建成线段树,一般的题目都需要对坐标离散。建树时,不要拘泥于线段树这个名字而只将线段建树,只要是表示区间,而且区间是由单位元素(可以是一个点、线段、或数组中一个值)组成的,都可以建线段树;不要拘泥于一维,根据题目要求可以建立面积树、体积树等等

  树的每个节点根据题目所需,设置变量记录要求的值

  用树形结构来维护这些变量:如果是求总数,则是左右儿子总数之和加上本节点的总数,如果要求最值,则是左右儿子的最大值再联系本区间。利用每次插入、删除时,都只对O(logL)个节点修改这个特点,在O(logL)的时间内维护修改后相关节点的变量。

  在非规则删除操作和大规模修改数据操作中,要灵活的运用子树的收缩与叶子节点的释放,避免重复操作。

  Trie的应用:;

  Trie图的应用探索: 后缀数组的应用研究:

  在字符串处理当中,后缀树和后缀数组都是非常有力的工具,其中后缀树了解得比较多,关于后缀数组则很少见于国内的资料。其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也不太逊色,并且,它比后缀树所占用的空间小很多。

  树状数组的应用探索:;

  计算几何

  掌握基本算法的实现。凸包的应用:;

  半平面交算法的应用:;

  几何+模拟类题目:几何设计好算法,模拟控制好精度。扫描法:;

  转化法:ZOJ 1606 将求所围的格子数,巧妙的转化为求多边形的面积。离散法思想的应用:;

  经典算法:找平面上的最近点对。

  贪心

  矩形切割

  二分思想应用

  活用经典算法

  利用归并排序算法思想求数列的逆序对数:

  利用快速排序算法思想,查询N个数中的第K小数:

  博弈问题

  博弈类题目通常用三类解法:第一类推结论; 第二类递推,找N位置,P位置; 第三类SG函数的应用。第四类极大极小法,甚至配合上αβ剪枝。最难掌握的就是第四类极大极小法。

  第一类:推结论。典型题目: 第二类:递推。典型题目:

  比如有向无环图类型的博弈。在一个有向图中,我们把选手I有必胜策略的初始位置称为N位置(Next player winning),其余的位置被称为P位置(Previous player winning)。很显然,P位置和N位置应该具有如下性质:

  1. 所有的结束位置都是P位置。

  2. 对于每一个N位置,至少存在一种移动可以将棋子移动到一个P位置。3. 对于每一个P位置,它的每一种移动都会将棋子移到一个N位置。

  这样,获胜的策略就是每次都把棋子移动到一个P位置,因为在一个P位置,你的对手只能将棋子移动到一个N位置,然后你总有一种方法再把棋子移动到一个P位置。一直这样移动,最后你一定会将棋子移动到一个结束位置(结束位置是P位置),这时你的对手将无法在移动棋子,你便赢得了胜利。

  与此同时,得到了这些性质,我们便很容易通过倒退的方法求出哪些位置是P位置,哪些位置是N位置,具体的算法为:

  1. 将所有的结束位置标为P位置。

  2. 将所有能一步到达P位置的点标为N位置。

  3. 找出所有只能到达N位置的点,将它们标为P位置。

  4. 如果在第三步中没有找到新的被标为P位置的点,则算法结束,否则转到步骤2。这样我们便确定了所有位置,对于题目给出的任一初始位置,我们都能够很快确定出是选手I获胜还是选手II获胜了。第三类:SG函数的应用。

  关于SG函数的基本知识:对于一个有向图(X, F)来说,SG函数g是一个在X上的函数,并且它返回一个非负整数值,具体定义为

  g(x)?min{n?0,n?g(y)对于所有y?F(x)}

  1. 对于所有的结束位置x,g(x)= 0。

  2. 对于每一个g(x)≠ 0的位置x,在它可以一步到达的位置中至少存在一个位置y使得g(y)= 0。

  3.对于每一个g(x)= 0的位置x,所有可以由它一步到达的位置y都有g(y)≠ 0。

  定理 如果g(xi)是第i个有向图的SG函数值,i = 1,…,n,那么在由这n个有向图组成的状态的SG函数值g(x1,…xn)= g(x1)xor g(x2)xor … xor g(xn)

  第四类:极大极小法。

  典型题目:ZOJ 1155:Triangle War

  ZOJ 1993:A Number Game

  矩阵妙用

  矩阵最基本的妙用就是利用快速乘法O(logn)来求解递推关系(最基本的就是求Fibonacci数列的某项)和各种图形变换,以及利用高斯消元法变成阶梯矩阵。典型题目:

  数学模型举例

  向量思想的应用:

  UVA :注意降维和向量的规范化 ;

  利用复数思想进行向量旋转。

  UVA :

  递推

  数代集合

  数代集合的思想:

  aCM ICPC 2002-2003, Northeastern European Region, Northern Subregion 中有一题:Intuitionistic Logic 用枚举+数代集合思想优化,注意到题中有一句话:“You may assume that the number H = |H| of elements of H?doesn't exceed 100”,这句话告诉我们H的元素个数不会超过100,因此可以考虑用一个数代替一个集合,首先把所有的运算结果都用预处理算出来,到计算的时候只要用O(1)的复杂度就可以完成一次运算。

  组合数学

  polya定理则是解决同构染色计数问题的有力工具。

  补集转化思想

  ZOJ 单色三角形:

  字符串相关

  扩展的KMP算法应用:;最长回文串; 最长公共子串; 最长公共前缀;

  填充问题

  高精度运算

  三维空间问题专题

  无论什么问题,一旦扩展到三难空间,就变得很有难度了。三维空间的问题,很考代码实现能力。

  其它问题的心得

  解决一些判断同构问题的方法:同构的关键在于一一对应,而如果枚举一一对应的关系,时间复杂度相当的高,利用最小表示,就能把一个事物的本质表示出来。求最小表示时,我们一定要仔细分析,将一切能区分两个元素的条件都在最小表示中体现,而且又不能主观的加上其他条件。得到最小表示后,我们往往还要寻求适当的、高效的匹配算法(例如KMP字符匹配之类的),来比较最小表示是否相同,这里常常要将我们熟悉的高效算法进行推广

算法总结3篇 基本算法语句总结相关文章:

排序算法总结3篇 十大经典排序算法总结

算法总结材料3篇 常用算法总结