动态规划算法实验报告(共17页).doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《动态规划算法实验报告(共17页).doc》由会员分享,可在线阅读,更多相关《动态规划算法实验报告(共17页).doc(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上实验标题1、 矩阵连乘 2、最长公共子序列 3、最大子段和 4、 凸多边形最优三角剖分 5、流水作业调度 6、0-1背包问题 7、最优二叉搜索树实验目的掌握动态规划法的基本思想和算法设计的基本步骤。实验内容与源码1、 矩阵连乘#include#includeusing namespace std;const int size=4;/ra,ca和rb,cb分别表示矩阵A和B的行数和列数void matriMultiply(int a4,int b4,int c4,int ra ,int ca,int rb ,int cb ) if(ca!=rb) cerr矩阵不可乘;
2、for(int i=0;ira;i+) for(int j=0;jcb;j+) int sum=ai0*b0j; for(int k=1;kca;k+) sum+=aik*bkj; cij=sum; void MatrixChain(int *p,int n,int m4,int s4) for(int i=1;i=n;i+) mii=0;/对角线 for(int r=2;r=n;r+)/外维 for(int i=1;i=n-r+1;i+)/上三角 int j=i+r-1; mij=mi+1j+pi-1*pi*pj; sij=i; for(int k=i+1;kj;k+) int t=mik+
3、mk+1j+pi-1*pk*pj; if(tmij) mij=t; sij=k; void Traceback(int i,int j,int s4) if(i = j) coutAi; else if(i+1 = j) cout(AiAj); else cout(; Traceback(i,sij,s); Traceback(sij+1,j,s); cout); int main() int w; coutw; int pw,sww; coutp0p1; for(int i=2 ; i=w ; i+) int m = pi-1; cout输入矩阵Aipi-1pi; if(pi-1 != m)
4、 coutendl维数不对,矩阵不可乘!endl; exit(1); Traceback(1,w,s); return 0;运行结果2、 最长公共子序列#include#include#define N 100using namespace std;/str1存储字符串x,str2存储字符串ychar str1N,str2N;/lcs存储最长公共子序列char lcsN;/cij存储str11.i与str21.j的最长公共子序列的长度int cNN;/flagij=0为str1i=str2j/flagij=1为ci-1j=sij-1/flagij=-1为ci-1jsij-1int flagNN
5、;/求长度int LCSLength(char *x, char *y) int i,j; /分别取得x,y的长度 int m = strlen(x); int n = strlen(y); for(i=1;i=m;i+) ci0 = 0; for(i=0;i=n;i+) c0i = 0; for(i=1;i=m;i+) for(j=1;j=cij-1) cij = ci-1j; flagij = 1; else cij = cij-1; flagij = -1; return cmn;/求出最长公共子序列char* getLCS(char *x, char *y,int len,char *
6、lcs) int i = strlen(x); int j = strlen(y); while(i&j) if(flagij=0) lcs-len = xi-1; i-; j-; else if(flagij=1) i-; else j-; return lcs;int main() int i; cout请输入字符串x:str1; cout请输入字符串y:str2; int lcsLen = LCSLength(str1,str2); cout最长公共子序列长度:lcsLenendl; char *p = getLCS(str1,str2,lcsLen,lcs); cout最长公共子序列为
7、:; for(i=0;ilcsLen;i+) coutlcsi ; return 0;运行结果3、最大子段和/分治法求最大子段和#includeusing namespace std;int MaxSubSum(int *a,int left,int right) int sum=0; if(left=right) sum=aleft0?aleft:0; else int center = (left+right)/2; /最大子段和在左边 int leftsum=MaxSubSum(a,left,center); /最大子段和在右边 int rightsum=MaxSubSum(a,cent
8、er+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;is2) s2=rights; sum=s1+s2;/前后子段和相加 /判断最大子段和 if(sumleftsum)sum=leftsum; if(sumrightsum) sum=rightsum; return sum;int MaxSum(int *a,int n) return MaxSub
9、Sum(a,1,n-1);int main() int a8=2,-3,-5,4,1,7,1,-5; cout最大子段和为:MaxSum(a,8); return 0;/动态规划法#includeusing namespace std;int MaxSum(int *a,int n) int sum=0,b=0; for(int i=1;i0) b+=ai; else b=ai; if(bsum) sum=b; return sum;int main() int a8=2,-3,-5,4,1,7,1,-5; cout最大子段和为:MaxSum(a,8); return 0;运行结果4、 凸多边
10、形最优三角剖分#include#include#include#define N 50using namespace std;struct 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)*(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 JudgeI
11、nput()/判断是否能构成凸多边形 point *v; /记录凸多边形各顶点坐标 int *total; /记录坐标在直线方程中的值 int m,a,b,c; coutm; int M = m-1; for(int i=0 ; im ; i+) cout输入顶点vivi.xvi.y; /根据顶点坐标判断是否能构成一个凸多边形 for(int j=0 ; jm ; 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; else a = vj
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 规划 算法 实验 报告 17
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内