欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    动态规划算法实验报告材料.docx

    • 资源ID:23181279       资源大小:164.20KB        全文页数:26页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    动态规划算法实验报告材料.docx

    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矩阵不可乘; for(

    2、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+mk+1

    3、j+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) cou

    4、tendl维数不对,矩阵不可乘!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 *lcs)

    6、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最长公共子序列为:; fo

    7、r(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,center+1,

    8、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 MaxSubSum(a

    9、,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 JudgeInput()

    11、/判断是否能构成凸多边形 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.y - v

    12、j+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) cout无法构成凸多边形!endl; exit(1); bool minWeightTriangulation()/计算最优值算法 int M; int *t, *s; point *v; for(int i=1 ; i=M ; i+) tii = 0; for(int r=2 ; r=M ; r+) for(int i=1 ; i=M-r+1 ; i+) int

    13、j = i+r-1; tij = ti+1j + w(vi-1,vi,vj); sij = i; for(int k=i+1 ; ki+r-1 ; k+) 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) if(i = j) return; Traceback(i,sij,s); Traceback(sij+1,j,s); cout三角形:vi-1vsijvjendl;int main() int *s; /记录最优三

    14、角剖分中所有三角形信息 int *t; /记录最优三角剖分所对应的权函数值 point *v; /记录凸多边形各顶点坐标 int *total; /记录坐标在直线方程中的值 int M=0; t = new int *N; s = new int *N; for(int i=0 ; iN ; i+) ti = new intN; si = new intN; v = new pointN; total = new intN; if(JudgeInput() if(minWeightTriangulation() Traceback(1,M,s); coutendl; cout最优权值之和为:t

    15、1Mendl; return 0;运行结果:5、流水作业调度#include#define N 100using namespace std;class Jobtype public: /* int operator=(Jobtype a)const return(key=a.key); */ int key; int index; bool job;void sort(Jobtype *d,int n) int i,j; Jobtype temp; bool exchange; /交换标志 for(i = 0;i = i;j -) if(dj+1.key dj.key) temp = dj+

    16、1; dj+1 = dj; dj = temp; exchange=true; /发生了交换,故将交换标志置为真 if(!exchange) /本趟排序未发生交换,提前终止算法 return; int FlowShop(int n,int *a,int *b,int *c) Jobtype *d = new Jobtypen; for(int i=0;ibi?bi:ai;/ 执行时间 di.job=ai=bi;/ 作业组 di.index=i;/作业序号 sort(d,n); int j=0; int k=n-1; for(int i=0;in;i+)/最优调度 if(di.job) cj+=

    17、di.index; else ck-=di.index; j=ac0; k=j+bc0; for(int i=1;in;i+) j+=aci; k=jk?k+bci:j+bci; delete d;/回收空间 return k;/返回调度时间int main() int n,*a,*b,*c; coutn; Jobtype *d = new JobtypeN; a=new intN; b=new intN; c=new intN; cout请输入作业号和时间:; for(int i=0;idi.indexdi.key; cout endl; int k=FlowShop(n,a,b,c); c

    18、outn调度时间:kendl; cout最优调度序列:; for (int i = 0; i n; i+) / 输出最优调度序列 cout ci ; return 0;运行结果:6、0-1背包问题#include #include using namespace std;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 ab?a:b;/*m为记录数组 mij代表在剩有j容量的条件下,从i开始往后的物品中

    19、可以取得的最大价值w为重量数组,v为价值数组n为物品个数,c为开始容量则m1c即此背包能剩下的最大价值*/void knapsack(int *m,int n, int c,int *w, int *v) int jMax = min(wn-1,c);/前n-1个物品 for(int j=0;j=jMax;j+) mnj=0; for(int j=wn;j1;i-) jMax=min(wi-1,c); for(int j=0;j=jMax;j+) mij = mi+1j; for(int j=wi;j=w1) m1c=max(m1c,m2c-w1+v1);/找出最优解,0表示不能装,1表示能装

    20、void traceback(int *m,int n,int c,int *x,int *w) for(int i=1;in;i+) if(mic=mi+1c) xi=0; else xi=1; c-=wi; xn=(mnc=0)?0:1;int main() int *v=new intN+1; int *w=new intN+1; int *m=new int* N+1; int *x=new int N+1; for(int i=0;iN+1;i+) mi=new intC+1; cout输入重量序列,N个endl; for(int i=1;iwi; cout输入价值序列,N个endl

    21、; for(int i=1;ivi; knapsack(m,N,C,w,v); traceback(m,N,C,x,w);cout最优值:m1Cendl;cout是否装入背包的情况:; for(int i=1;i=N;i+) coutxi; for(int i=0;iN+1;i+) delete mi; delete m; return 0;运行结果7、最优二叉搜索树#include#include#include#define N 100using namespace std;const double MAX = numeric_limits:max(); /double的最大值/ai为结点

    22、i被访问的概率/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; for(i=1; i=n+1; i+) mii-1 = bi-1; wii-1 = bi-1; for(l=1; l=n; l+) for(i=1; i=n-l+1; i+) j = l+i-1; mij = MAX; wij = wij-1 + aj +bj; for(r=i; r=j; r+) double k = mir-1 + wij + mr+1j; if(kmij) mij = k; sij = k; coutm1n;int main() double aN,bN; int n; double sum = 0; int i,j,l;


    注意事项

    本文(动态规划算法实验报告材料.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

    经营许可证编号:鄂ICP备2022015515号-1

    收起
    展开