《算法的设计》课程解题报告.docxVIP

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《算法设计》课程报告课题名称: 算法设计课程解题报告课题负责人名(学号): 郭泉(0643111084)同组成员名单(角色): 独立完成指导教师: 左劼评阅成绩: 评阅意见: 提交报告时间:2008 年12月7日目录《算法设计》课程报告1递归与分治策略4问题描述4算法设计4数据输入4结果输出4问题分析5代码5非递归化:6测试数据及运行结果7复杂度分析7动态规划8问题描述8算法设计8数据输入8结果输出8问题分析8代码9测试数据及运行结果10复杂度分析11和其他算法的比较11贪心算法11问题描述11算法设计11数据输入11结果输出11问题分析12代码12测试数据及运行结果13复杂度分析14和其他算法的比较14回溯法14问题描述14算法设计14数据输入14结果输出15问题分析15代码15测试数据及运行结果16复杂度分析16和其他算法的比较17分支限界法17问题描述17算法设计17数据输入17结果输出17问题分析18代码18测试数据及运行结果21复杂度分析21和其他算法的比较21《算法设计》课程解题报告软件工程 专业学生 郭泉 指导老师 左劼递归与分治策略排列的字典顺序问题问题描述n个元素{1, 2, …, n}有n!个不同的排列。将这n!个排列按字典序排列,并编号0, 1, …,n!-1。每个排列的编号为其字典序值。算法设计给定n及n个元素{1, 2, …, n}的一个排列,计算出这个排列的字典序值。数据输入由文件input.txt提供输入数据。文件的第一行是元素个数n。接下来的1行是n个元素{1, 2, …, n}的一个排列。结果输出将计算出的排列的字典序输出到文件output.txt。输入文件示例input.txt82 6 4 5 8 1 7 3输出文件示例output.txt8227问题分析对于给定{1, 2, …, n}的一个排列arr,设字典序为DictRankn(arr)。容易知道:(arr[0] – 1) * (n - 1)! = DictRankn(arr) = arr[0] * (n - 1)! – 1既字典序值必大于排列第一个元素arr[0]开始的全排列,且可知DictRankn(arr)是由(arr[0] – 1) * (n - 1)!和排列除第一个元素外的元素在子列内的字典序组成。由此,我们可以构造递归式:DictRankn(arr) = (arr[0] – 1) * (n - 1)! + DictRankn-1(arr’)其中,arr’是arr去掉arr[0]后,在原集合{1, 2, …, n}中去除arr[0]后组成的集合中的字典序。元集合去掉arr[0]需要将所有的大于arr[0]的值的元素减一,故arr’中的大于arr[0]的值的元素也需要减一,组成n-1个元素的排列。既:arr’[i] = arr[i+1] – 1,arr[i+1] arr[0];arr[i+1],arr[i+1] arr[0];初始条件为:DictRank1({1}) = 0代码#include iostream#include fstreamusing namespace std;// calc the factorial of nint factorial(int n){ int s = 1; for(;n0;n--) s *= n; return s;}// calc the dictRank of an arrangementint dictRank(int* arr, int n){ // define the edge if(n == 1) { // if only one element, it the first return 0; } // heading value arr[0] int h = arr[0]; // new arr - arr // shift every element left, if greater than arr[0], decrease by 1 for(int i = 0; i n - 1; i++) if(arr[i + 1] h) { arr[i] = arr[i + 1] - 1; } else { arr[i] = arr[i + 1]; } // return recursion invoke return (h - 1) * factorial(n - 1) + dictRank(arr, n - 1);}int main(){ // inout and output files ifstream fin(input.txt, ios::in); ofstream fout(output.txt, ios::out); // read in n and

您可能关注的文档

文档评论(0)

lingyun51 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档