随笔分类 - 算法类
摘要://1.编写程序,在O(n)时间内从数组x[0...n-1]中找出第K个最小的元素。算法可以对x中的元素进行排序int bigrand( ){ return RAND_MAX*rand() +rand();}int randint(int l,int u){ return 1+bigrand() %(u-l+1);}void select(int left, int right ,int x[],int k){ if ( left >= right) return; int random=randint(left,right); swap( left, random ); int t =
阅读全文
摘要:卡特兰数:规定C0=1,而C1=1,C2=2,C3=5,C4=14,C5=42,C6=132,C7=429,C8=1430,C9=4862,C10=16796,C11=58786,C12=208012,C13=742900,C14=2674440,C15=9694845···························
阅读全文
摘要://回溯法解决旅行售货员问题template<class Type>class Traveling{ friend Type TSP(int **,int [],int,Type); friend void main(void);public: Type BBTSP(int v[]);private: void Backtrack(int i); int n, //图G的顶点数 *x, //当前解 *bestx; //当前最优解 Type **a, ...
阅读全文
摘要://使用分治策略,设计解棋盘覆盖问题的简洁算法#define SIZE 512static int tile=0;//L型骨牌号int Board[SIZE][SIZE];void ChessBoard(int tr,int tc,int dr,int dc,int size){ if(size==1) return; int t=tile++,s=size/2;//分割棋盘 //覆盖左上角子棋盘 if(dr<tr+s&&dc<tc+s) ChessBoard(tr,tc,dr,dc,s); else{ //此棋盘中无特殊方格 //...
阅读全文
摘要:#include<iostream>using namespace std;//动态规划解决矩阵连乘问题void MatrixChain(int *p,int n,int **m,int **s){ for(int i=1;i<=n;i++) //初始化m[i][i] m[i][i]=0; for(int r=2;r<=n;r++) //矩阵链的长度2,3,4... for(int i=1;i<=n-r+1;i++) //确定i { in...
阅读全文
摘要:#include<iostream>using namespace std;//动态规划解决最长公共子串void LCSLength(int m,int n,char *x,char *y,int **c,int **b){ int i,j; for(i=1;i<=m;i++) c[i][0]=0; for(i=1;i<=n;i++) c[0][i]=0; for(i=1;i<=m;i++) for(j=1;j<=n;j++) { if(x[i]==x[j]) { c[...
阅读全文
摘要://动态规划解决0-1背包问题template<class Type>void Knapsack(Type v,int w,int c,int n,Type **m){ int jMax=min(w[n]-1,c); for(int j=0;j<=jMax;j++) m[n][j]=0; for(int j=w[n];j<=c;j++) m[n][j]=v[n]; for(int i=n-1;i>1;i--) { jMax=min(w[i]-1,c); for(int j=0;j<=jMax;j++) ...
阅读全文
摘要:#include<iostream>using namespace std;//贪心法求单源最短路径template<class Type>void Dijkstra(int n,int v,Type dist[],int prev[],Type **c){ bool s[maxint]; for(int i=1;i<=n;i++) //以V为出发点,初始化dist[i],s[i]和prev[i]的值 { dist[i]=c[v][i]; s[i]=false; if(dist[i]==maxint) ...
阅读全文

浙公网安备 33010602011771号