1、i+)/上三角 int j=i+r-1; mij=mi+1j+pi-1*pi*pj; sij=i; for(int k=i+1;j; int t=mik+mk+1j+pi-1*pk*pj; if(tmij) mij=t; sij=k;void Traceback(int i,int j,int s4) if(i = j) coutw; int pw,sww;输入矩阵A1维数:p0p1; for(int i=2 ; ipi; if(pi-1 != m)endl#define N 100/str1存储字符串x,str2存储字符串ychar str1N,str2N;/lcs存储最长公共子序列char
2、 lcsN;/cij存储str11.i与str21.j的最长公共子序列的长度int cNN;/flagij=0为str1i=str2j/flagij=1为ci-1j=sij-1/flagij=-1为ci-1j=cij-1) cij = ci-1j; flagij = 1; cij = cij-1; flagij = -1; return cmn;/求出最长公共子序列char* getLCS(char *x, char *y,int len,char *lcs) int i = strlen(x); int j = strlen(y); while(i&j) if(flagij=0) lcs-l
3、en = xi-1; i-; j-; else if(flagij=1) return lcs; int i;请输入字符串x:str1;请输入字符串y:str2; int lcsLen = LCSLength(str1,str2);最长公共子序列长度:lcsLen char *p = getLCS(str1,str2,lcsLen,lcs);最长公共子序列为:lcsLen;lcsi0?aleft:0; int center = (left+right)/2; /最大子段和在左边 int leftsum=MaxSubSum(a,left,center); /最大子段和在右边 int rights
4、um=MaxSubSum(a,center+1,right); /最大子段和在中间 int s1=0; int lefts=0; for(int i=center;i=left;i-) lefts+=ai; if(leftss1) s1=lefts; int s2=0; int rights=0; for(int i=center+1;=right; rights+=ai; if(rightss2) s2=rights; sum=s1+s2;/前后子段和相加 /判断最大子段和 if(sumleftsum)sum=leftsum;rightsum) sum=rightsum; return su
5、m;int MaxSum(int *a,int n) return MaxSubSum(a,1,n-1); int a8=2,-3,-5,4,1,7,1,-5;最大子段和为:MaxSum(a,8);/动态规划法 int sum=0,b=0;n;i+)/此处不能=n, if(b0) b+=ai; else b=ai;sum) sum=b;4、凸多边形最优三角剖分cmath#define N 50struct point int x; int y;int distance(point X, point Y)/两点距离 int dis = (Y.x-X.x)*(Y.x-X.x) + (Y.y-X.y
6、)*(Y.y-X.y); return (int)sqrt(dis);int w(point a, point b, point c)/权值 return distance(a,b) + distance(b,c) + distance(a,c);bool JudgeInput()/判断是否能构成凸多边形 point *v; /记录凸多边形各顶点坐标 int *total; /记录坐标在直线方程中的值 int m,a,b,c;请输入凸多边形顶点个数:m; int M = m-1; for(int i=0 ;m ;输入顶点v的坐标:vi.xvi.y; /根据顶点坐标判断是否能构成一个凸多边形 f
7、or(int j=0 ; j j+) int p = 0; int q = 0; if(m-1 = j) a = vm-1.y - v0.y; b = vm-1.x - v0.y; c = b * vm-1.y - a * vm-1.x; a = vj.y - vj+1.y; b = vj.x - vj+1.x; c = b * vj.y - a * vj.x; for(int k=0 ; k 0) p = p+1; else if(totalk 0 & q0) | (p=0 & q=0)无法构成凸多边形!bool minWeightTriangulation()/计算最优值算法 int M;
8、 int *t, *s; for(int i=1 ;=M ; tii = 0; for(int r=2 ; r r+)=M-r+1 ; int j = i+r-1; tij = ti+1j + w(vi-1,vi,vj); sij = i; for(int k=i+1 ;i+r-1 ; int u = tik + tk+1j + w(vi-1,vk,vj); if(u tij) tij = u; sij = k; return true;void Traceback(int i, int j, int *s) return;三角形:vi-1sij int *s; /记录最优三角剖分中所有三角形
9、信息 int *t; /记录最优三角剖分所对应的权函数值 int M=0; t = new int *N; s = new int *N;N ; ti = new intN; si = new intN; v = new pointN; total = new intN; if(JudgeInput() if(minWeightTriangulation() Traceback(1,M,s);最优权值之和为:t1M运行结果:5、流水作业调度class Jobtype public: /* int operator=(Jobtype a)const return(key=a.key); */ i
10、nt key; int index; bool job;void sort(Jobtype *d,int n) Jobtype temp; bool exchange; /交换标志 for(i = 0;i = i;j -) if(dj+1.key bi?bi:ai;/ 执行时间 di.job=ai=bi;/ 作业组 di.index=i;/作业序号 sort(d,n); int j=0; int k=n-1;i+)/最优调度 if(di.job) cj+=di.index; ck-=di.index; j=ac0; k=j+bc0; j+=aci; k=jdi.key; cout endl;
11、int k=FlowShop(n,a,b,c);n调度时间:最优调度序列: for (int i = 0; i i+) / 输出最优调度序列 ci 6、0-1背包问题#include const int C=10;/容量const int N=5;/个数int max(const int a,const int b) return ab?a:b;int min(const int a,const int b) return a=w1) m1c=max(m1c,m2c-w1+v1);/找出最优解,0表示不能装,1表示能装void traceback(int *m,int n,int c,int
12、*x,int *w) if(mic=mi+1c) xi=0; xi=1; c-=wi; xn=(mnc=0)?0: int *v=new intN+1; int *w=new intN+1; int *m=new int* N+1; int *x=new int N+1;N+1; mi=new intC+1;输入重量序列,N个=N;wi;输入价值序列,vi; knapsack(m,N,C,w,v); traceback(m,N,C,x,w);cout最优值:m1Cconst double MAX = numeric_limits:max(); /double的最大值/ai为结点i被访问的概率/
13、bi为“虚结点”i被访问的概率/mij用来存放子树(i,j)的期望代价/wij用来存放子树(i,j)的所有结点(包括虚结点)的a,b概率之和/sij用来跟踪root的void OptimalBinarySearchTree(double *a,double *b,int n) int sNN; double mNN; double wNN; int i,j,l,r;=n+1; mii-1 = bi-1; wii-1 = bi-1; for(l=1; l l+)=n-l+1; j = l+i-1; mij = MAX; wij = wij-1 + aj +bj; for(r=i;=j; double k = mir-1 + wij + mr+1j; if(k mij = k;m1n; double aN,bN; int n; double sum = 0; int i,j,l; co