重庆大学算法导论跳桩得珠宝问题项目报告(包含报告和源代码)(共10页)_第1页
重庆大学算法导论跳桩得珠宝问题项目报告(包含报告和源代码)(共10页)_第2页
重庆大学算法导论跳桩得珠宝问题项目报告(包含报告和源代码)(共10页)_第3页
重庆大学算法导论跳桩得珠宝问题项目报告(包含报告和源代码)(共10页)_第4页
重庆大学算法导论跳桩得珠宝问题项目报告(包含报告和源代码)(共10页)_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上重庆大学项目报告项目题目: 跳桩得珠宝问题 学 院: 专业班级: 计科 年 级: 2011级 姓 名: 学 号: 完成时间: 2013 年 6 月 7 日指导教师: 陈波 重庆大学教务处制 专心-专注-专业项目报告正文一.问题描述 有m排n列的柱桩,每一排的柱桩从左向右标号为1,2,n,且在每个柱桩上预先放好价值不一样的宝石。现在有位杂技演员从第一排的第1号柱桩开始跳跃,每次都必须跳到下一排的柱桩上,且每次跳跃最多只能向左或向右移动一个桩子。也就是说如果现在杂技演员站在第j号桩上,那么他可跳到下一排的第j号桩上,也可跳到下一排的第j-1 (if j>1)或者 j

2、+1 (if j<n) 号桩上,并得到桩上的宝石。计算出一条最佳的跳跃顺序,使杂技演员获得的宝石的总价值最大。 二.算法思想问题抽象: 对于这个问题,可以抽象为:从顶部出发,在每一结点可以选择向左走,向下走或是向右走, 一直走到底层,要求找出一条路径,使路径上的值最大。 问题分析: 这道题如果用枚举法,在数塔层数稍大的情况下(如40),则需要列举出的路径条数将是一个非常庞大的数目。 如果用贪心法又往往得不到最优解。 在用动态规划考虑数塔问题时可以自顶向下的分析,自底向上的计算。于是在确定使用动态规划的情况下,对该问题进行分析。算法思想: 从顶点出发时到底向左走,向下走还是向右走应取决于是

3、从哪个方向走能取到最大值, 只要左中右三道路径上的最大值求出来了才能作出决策。同样的道理下一层的走向又要取决于再下一层上的最大值是否已经求出才能决策。 这样一层一层推下去,直到倒数第二层时就非常明了。所以实际求解时,可从底层开始,层层递进,最后得到最大值。 首先,我可以确定,对于矩阵可以用一个二维数组dp储存它,并且可以用(i,j)描述一个数字在矩阵中的位置。对于中间的一个点来说,想经过它则必须经过它的上方或左上或右上,也就是说经过这个点的数字和最大等于经过上方或左上方或右上方的所得的“最大和”中一个更大的加上这个点中的数字。显然这个定义满足最优子结构。三.递推方程式设计一个二维状态opti,

4、j表示走到第i行第j列时经过的数字的最大和。决策是opti-1,j 或opti-1,j-1或opti-1,j+1中一个更大的加上(i,j)点的数字。对于一个点只考虑上面或左上或右上即前一阶段,满足无后效性。状态转移方程(顺推): opti-1,j+dpi,j (j=1)opti,j= opti-1,j-1+ dpi,j (j=max) maxopti-1,j,opti-1,j-1+ dpi,j (1<j<max)实现时可以将opti,j的左右边界定义的大点,初始opti,j=0,由于在j=1时opti-1,j-1=0,opti-1,j>=0所以方程也可以这样写:opti,j=

5、maxopti-1,j,max(opti-1,j-1,opti-1,j+1)+ai,j同理j=i时方程也可以写成上面那样,所以方程综合为:opti,j=maxopti-1,j,max(opti-1,j-1,opti-1,j+1)+ai,j (1<j<max)显然答案是走到底后的一个最大值,即:ans=maxoptn,i (1<=i<=n)其实从上往下走和从下往上走结果是一样的,但是如果从下往上走结果就是opt1,1省下求最大值了,所以方程进一步改动(逆推):opti,j=maxopti+1,j,max(opti-1,j-1,opti-1,j+1)+ai,j(0<j

6、<=i)四.最优子结构性质对于中间的一个点来说,想经过它则必须经过它的上方或左上或右上,也就是说经过这个点的数字和最大等于经过上方或左上方或右上方的所得的“最大和”中一个更大的加上这个点中的数字。显然这个定义满足最优子结构。以此为递推关系。五.程序结构的描述 此程序主要分为以下四个部分 文件读入(从文件中读取矩阵的值应存入二维数组中) 最大值计算(用递推式推出) 明确路径(用一个path数组记录下动态) 在文件中显示(读入文件)最大值的计算主要用上述递推式,路径的求得是定义了一个二维数组path,用这个二维数组存取dp中相对应位置的路线动态,比如说在(i,j)点在接下来一行要向右,我们就

7、将pathij赋值为1,则循环时用i+;j+=pathij,就将位置右移一个,同理可令向左为-1,向下为0. for(int i = 0, j = 0; i<M; +i) file2<< "" << i+1<< "," << j+1 << "" << " -> " j += pathij; 六.计算复杂度分析此实验中,作为基本操作的原操作是max();即比较函数,在循环中,进行了N2次,而比较函数其运行时间为常数O(1),故计算最大

8、值部分T(n)=O(n2);同理,在路径输出部分,关键代码是j+=pathij;其T(n)=O(n);该算法总的时间复杂度T(n)=O(n2)。七.测试结果:test.txt文件:柱桩20排20列:柱桩4排4列:全部代码:#include <iostream>#include <algorithm>#include <fstream>using namespace std;int const MAX =20;int M,N,num=0;int main()int count=0; fstream file1,file2; file1.open("t

9、est.txt",ios:in); if(!file1) cout<<"input file not founded"<<endl; cout<<" *跳桩得珠宝*"<<endl; cout<<" *1柱桩20排20列*"<<endl; cout<<" *2自定义柱桩排列*"<<endl; cout<<"请输入您的选择:"cin>>num;if(num=2) cout

10、<<"请输入排与列(排与列均小于20):"<<endl; cin>>M>>N; elseif(num=1)M=N=MAX;elsecout<<"输入不符,重新启动!" int dpMAXMAX = 0; int pathMAXMAX = MAX;/描写路径的坐标 while(!file1.eof()/是否到文件结尾 for(int i=0;i<M;i+) for(int j=0;j<N;j+) file1>>dpij; count+; if(count=M*N)break

11、; file2.open("output.txt",ios:out); if(!file2) cout<<"output file not founded"<<endl; for(int i=0;i<M;i+) for(int j=0;j<N;j+) file2<<dpij; file2<<"," file2<<"n" file1.close(); for(int i=M - 2; i>=0; i-) for(int j=0; j<

12、=N-1; j+)if(j=0)dpij = max(dpi + 1j,dpi+1j+1) + dpij;if (dpi+1j > dpi+1j+1) /正下方大 pathij = 0; /选择正下方 else /右边大 pathij =1; /选择右边 else dpij = max(dpi + 1j-1, max(dpi + 1j,dpi+1j+1) + dpij; if(dpi+1j-1 >=dpi+1j)&&(dpi+1j-1 >=dpi+1j+1) pathij = -1;elseif(dpi+1j > dpi+1j-1)&&(dpi+1j >=dpi+1j+1) /正下方大pathij = 0; /选择正下方else /右边大 pathij = 1; /选择右边 file2<<dp00<<"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论