动态规划—整数划分和矩阵连乘的java程序

合集下载

电大计算机本科_算法设计与分析(期末考试复习题含答案)

电大计算机本科_算法设计与分析(期末考试复习题含答案)

1、二分搜索算法是利用( A )实现的算法。

A、分治策略B、动态规划法C、贪心法D、回溯法2、下列不是动态规划算法基本步骤的是( A )。

A、找出最优解的性质B、构造最优解C、算出最优解D、定义最优解3、最大效益优先是( A )的一搜索方式。

A、分支界限法B、动态规划法C、贪心法D、回溯法4、在下列算法中有时找不到问题解的是( B )。

A、蒙特卡罗算法B、拉斯维加斯算法C、舍伍德算法D、数值概率算法5. 回溯法解旅行售货员问题时的解空间树是( A ).A、子集树B、排列树C、深度优先生成树D、广度优先生成树6.下列算法中通常以自底向上的方式求解最优解的是( B )。

A、备忘录法B、动态规划法C、贪心法D、回溯法7、衡量一个算法好坏的标准是(C )。

A 运行速度快B 占用空间少C 时间复杂度低D 代码短8、以下不可以使用分治法求解的是(D )。

A 棋盘覆盖问题B 选择问题C 归并排序D 0/1背包问题9。

实现循环赛日程表利用的算法是( A ).A、分治策略B、动态规划法C、贪心法D、回溯法10、下列随机算法中运行时有时候成功有时候失败的是(C )A 数值概率算法B 舍伍德算法C 拉斯维加斯算法D 蒙特卡罗算法11.下面不是分支界限法搜索方式的是( D )。

A、广度优先B、最小耗费优先C、最大效益优先D、深度优先12.下列算法中通常以深度优先方式系统搜索问题解的是( D ).A、备忘录法B、动态规划法C、贪心法D、回溯法13.备忘录方法是那种算法的变形。

( B )A、分治法B、动态规划法C、贪心法D、回溯法14.哈弗曼编码的贪心算法所需的计算时间为( B )。

A、O(n2n)B、O(nlogn)C、O(2n)D、O(n)15.分支限界法解最大团问题时,活结点表的组织形式是( B ).A、最小堆B、最大堆C、栈D、数组16.最长公共子序列算法利用的算法是( B )。

A、分支界限法B、动态规划法C、贪心法D、回溯法17.实现棋盘覆盖算法利用的算法是( A ).A、分治法B、动态规划法C、贪心法D、回溯法18.下面是贪心算法的基本要素的是( C )。

算法习题——精选推荐

算法习题——精选推荐

算法习题算法设计与分析试卷⼀、填空题(20分,每空2分)1、算法的性质包括输⼊、输出、确定性、有限性。

2、动态规划算法的基本思想就将待求问题分解成若⼲个⼦问题、先求解⼦问题,然后从这些⼦问题的解得到原问题的解。

3、设计动态规划算法的4个步骤:(1)找出最优解的性质,并刻画其结构特征。

(2)递归地定义最优值。

(3)以⾃底向上的⽅式计算出最优值。

(4)根据计算最优值得到的信息,构造最优解。

4、流⽔作业调度问题的johnson算法:(1)令N1={i|ai=bj};(2)将N1中作业依ai的ai的⾮减序排序;将N2中作业依bi的⾮增序排序。

5、对于流⽔作业⾼度问题,必存在⼀个最优调度π,使得作业π(i)和π(i+1)满⾜Johnson不等式min{bπ(i),aπ(i+1)}≥min{bπ(i+1),aπ(i)}。

6、最优⼆叉搜索树即是最⼩平均查找长度的⼆叉搜索树。

⼆、综合题(50分)1、当(a1,a2,a3,a4,a5,a6)=(-2,11,-4,13,-5,-2)时,最⼤⼦段和为∑ak(2<=k<=4)=20(5分)2、由流⽔作业调度问题的最优⼦结构性质可知,T(N,0)=min{ai+T(N-{i},bi)}(1=3、最⼤⼦段和问题的简单算法(10分)int maxsum(int n,int *a,int & bestj){Int sum=0;for (int i=1;i<=n;i++)for (int j=i;j<=n;j++)int thissum=0;for(int k=i;k<=j;k++)this sum+=a[k];if(thissum>sum){sum=thissum;besti=i;bestj=j;}}return sum;}4、设计最优⼆叉搜索树问题的动态规划算法OptimalBinarysearchTree? (15分)Void OptimalBinarysearchTree(int a,int n,int * * m, int * * w){for(int i=0;i<=n;i++) {w[i+1][i]=a[i]; m[i+1][i]= 0;}for(int r=0;rfor(int i=1;i<=n-r;i++){int j=i+r;w[i][j]=w[i][j-1]+a[j]+b[j];m[i][j]= m[i+1][j];s[i][j]=i;for(int k=i+1;k<=j;k++){int t=m[i][k-1]+m[k+1][j];if(t}m[i][j]=t; s[i][j]=k;}}5、设n=4, (a1,a2,a3,a4)=(3,4,8,10), (b1,b2,b3,b4)=(6,2,9,15) ⽤两种⽅法求4个作业的最优调度⽅案并计算其最优值?(15分)法⼀:min(ai,bj)<=min(aj,bi)因为min(a1,b2)<=min(a2,b1)所以1→2 (先1后2)由min(a1,b3)<=min(a3,b1)得1→3 (先1后3)同理可得:最后为1→3→4→2法⼆:johnson算法思想N1={1,3,4} N2={2}N11={1,3,4} N12={2}所以N11→N12得:1→3→4→2三、简答题(30分)1、将所给定序列a[1:n]分为长度相等的两段a[1:n/2]和a[n/2+1:n],分别求出这两段的最⼤⼦段和,则a[1:n]的最⼤⼦段和有哪三种情形?(10分)答:(1)a[1:n]的最⼤⼦段和与a[1:n/2]的最⼤⼦段和相同。

java经典编程题目

java经典编程题目

java经典编程题目
以下是一些经典的Java编程题目,这些题目可以帮助你提高编程技巧和解决问题的能力:
1.反转字符串:编写一个Java方法,将给定的字符串反转。

2.斐波那契数列:编写一个Java方法,计算并返回斐波那契数列的第n项。

3.查找最大和最小元素:编写一个Java方法,在一个整数数组中查找最大和最小元素。

4.反转数组:编写一个Java方法,将给定的整数数组反转。

5.判断回文:编写一个Java方法,判断给定的字符串是否是回文。

6.计算阶乘:编写一个Java方法,计算给定整数的阶乘。

7.冒泡排序:编写一个Java方法,对给定的整数数组进行冒泡排序。

8.二分查找:编写一个Java方法,在已排序的整数数组中查找指定的元素。

9.合并两个有序数组:编写一个Java方法,将两个已排序的整数数组合并为一个新的已排序数组。

10.实现二叉树:编写一个Java类,实现二叉树数据结构,并实现插入、查找和删除节点的方法。

这些题目可以帮助你掌握Java编程的基础知识和技能,提高你的编程能力和解决问题的能力。

算法设计与分析复习题目及答案 (3)

算法设计与分析复习题目及答案 (3)

分治法1、二分搜索算法是利用(分治策略)实现的算法。

9. 实现循环赛日程表利用的算法是(分治策略)27、Strassen矩阵乘法是利用(分治策略)实现的算法。

34.实现合并排序利用的算法是(分治策略)。

实现大整数的乘法是利用的算法(分治策略)。

17.实现棋盘覆盖算法利用的算法是(分治法)。

29、使用分治法求解不需要满足的条件是(子问题必须是一样的)。

不可以使用分治法求解的是(0/1背包问题)。

动态规划下列不是动态规划算法基本步骤的是(构造最优解)下列是动态规划算法基本要素的是(子问题重叠性质)。

下列算法中通常以自底向上的方式求解最优解的是(动态规划法)备忘录方法是那种算法的变形。

(动态规划法)最长公共子序列算法利用的算法是(动态规划法)。

矩阵连乘问题的算法可由(动态规划算法B)设计实现。

实现最大子段和利用的算法是(动态规划法)。

贪心算法能解决的问题:单源最短路径问题,最小花费生成树问题,背包问题,活动安排问题,不能解决的问题:N皇后问题,0/1背包问题是贪心算法的基本要素的是(贪心选择性质和最优子结构性质)。

回溯法回溯法解旅行售货员问题时的解空间树是(排列树)。

剪枝函数是回溯法中为避免无效搜索采取的策略回溯法的效率不依赖于下列哪些因素(确定解空间的时间)分支限界法最大效益优先是(分支界限法)的一搜索方式。

分支限界法解最大团问题时,活结点表的组织形式是(最大堆)。

分支限界法解旅行售货员问题时,活结点表的组织形式是(最小堆)优先队列式分支限界法选取扩展结点的原则是(结点的优先级)在对问题的解空间树进行搜索的方法中,一个活结点最多有一次机会成为活结点的是( 分支限界法).从活结点表中选择下一个扩展结点的不同方式将导致不同的分支限界法,以下除( 栈式分支限界法)之外都是最常见的方式.(1)队列式(FIFO)分支限界法:按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。

(2)优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。

java数组分割方法(一)

java数组分割方法(一)

Java数组是一种非常常用的数据结构,它能够存储一系列相同类型的数据。

在实际开发中,我们经常需要对数组进行分割操作,以便进行各种数据处理和计算。

本文将详细介绍Java数组分割的各种方法,包括使用循环、Arrays类、Stream API等多种方式。

使用循环进行数组分割在Java中,我们可以使用循环来手动实现对数组的分割。

具体操作可以分为以下几个步骤:1. 创建一个新的数组,用于存储分割后的子数组。

2. 定义一个变量来记录每个子数组的长度。

3. 使用循环遍历原始数组,根据指定的长度将数组分割成若干个子数组。

4. 将每个子数组存储到新的数组中。

这种方法虽然比较直接,但需要手动编写大量代码,且不够简洁高效。

使用Arrays类进行数组分割Java中的Arrays类提供了一系列用于操作数组的静态方法,其中就包括了对数组进行分割的方法。

常见的有以下几种:1. ():该方法可以复制指定范围内的数组元素,从而实现数组分割。

2. ():该方法可以复制指定长度的数组元素,也可以用于数组分割。

使用这些方法可以简单快捷地对数组进行分割,减少了手动编写循环的繁琐工作。

使用Stream API进行数组分割Java 8引入了Stream API,它提供了丰富的操作符用于对集合和数组进行处理。

通过Stream API,我们可以实现对数组的高效分割操作。

具体步骤如下:1. 将数组转换为流。

2. 使用Stream的操作符进行分割,如limit()、skip()等。

3. 将分割后的元素收集到新的数组中。

Stream API使得对数组的分割操作变得简单易行,尤其是在处理大量数据时,其高效性能表现得尤为突出。

综合比较通过上述介绍,我们可以看出,Java中有多种方法可以实现数组的分割操作。

使用循环虽然较为繁琐,但可以灵活控制每个子数组的长度和范围;Arrays类提供了简单的静态方法,可以快速实现数组分割;Stream API则是Java 8引入的新特性,提供了更加便利和高效的方式来处理数组。

计算机算法设计和分析习题及答案解析

计算机算法设计和分析习题及答案解析

计算机算法设计与分析习题及答案一.选择题1、二分搜索算法是利用 A 实现的算法;A、分治策略B、动态规划法C、贪心法D、回溯法2、下列不是动态规划算法基本步骤的是 A ;A、找出最优解的性质B、构造最优解C、算出最优解D、定义最优解3、最大效益优先是A 的一搜索方式;A、分支界限法B、动态规划法C、贪心法D、回溯法4. 回溯法解旅行售货员问题时的解空间树是 A ;A、子集树B、排列树C、深度优先生成树D、广度优先生成树5.下列算法中通常以自底向上的方式求解最优解的是B ;A、备忘录法B、动态规划法C、贪心法D、回溯法6、衡量一个算法好坏的标准是 C ;A 运行速度快B 占用空间少C 时间复杂度低D 代码短7、以下不可以使用分治法求解的是 D ;A 棋盘覆盖问题B 选择问题C 归并排序D 0/1背包问题8. 实现循环赛日程表利用的算法是A ;A、分治策略B、动态规划法C、贪心法D、回溯法9.下面不是分支界限法搜索方式的是D ;A、广度优先B、最小耗费优先C、最大效益优先D、深度优先10.下列算法中通常以深度优先方式系统搜索问题解的是D ;A、备忘录法B、动态规划法C、贪心法D、回溯法11.备忘录方法是那种算法的变形; BA、分治法B、动态规划法C、贪心法D、回溯法12.哈夫曼编码的贪心算法所需的计算时间为B ;A、On2nB、OnlognC、O2nD、On13.分支限界法解最大团问题时,活结点表的组织形式是B ;A、最小堆B、最大堆C、栈D、数组14.最长公共子序列算法利用的算法是B;A、分支界限法B、动态规划法C、贪心法D、回溯法15.实现棋盘覆盖算法利用的算法是A ;A、分治法B、动态规划法C、贪心法D、回溯法16.下面是贪心算法的基本要素的是C ;A、重叠子问题B、构造最优解C、贪心选择性质D、定义最优解17.回溯法的效率不依赖于下列哪些因素 DA.满足显约束的值的个数B. 计算约束函数的时间C.计算限界函数的时间D. 确定解空间的时间18.下面哪种函数是回溯法中为避免无效搜索采取的策略BA.递归函数 B.剪枝函数 C;随机数函数 D.搜索函数19. D是贪心算法与动态规划算法的共同点;A、重叠子问题B、构造最优解C、贪心选择性质D、最优子结构性质20. 矩阵连乘问题的算法可由 B 设计实现;A、分支界限算法B、动态规划算法C、贪心算法D、回溯算法21. 分支限界法解旅行售货员问题时,活结点表的组织形式是 A ;A、最小堆B、最大堆C、栈D、数组22、Strassen矩阵乘法是利用A 实现的算法;A、分治策略B、动态规划法C、贪心法D、回溯法23、使用分治法求解不需要满足的条件是 A ;A 子问题必须是一样的B 子问题不能够重复C 子问题的解可以合并D 原问题和子问题使用相同的方法解24、下面问题 B 不能使用贪心法解决;A 单源最短路径问题B N皇后问题C 最小生成树问题D 背包问题25、下列算法中不能解决0/1背包问题的是 AA 贪心法B 动态规划C 回溯法D 分支限界法26、回溯法搜索状态空间树是按照 C 的顺序;A 中序遍历B 广度优先遍历C 深度优先遍历D 层次优先遍历27.实现合并排序利用的算法是A ;A、分治策略B、动态规划法C、贪心法D、回溯法28.下列是动态规划算法基本要素的是D ;A、定义最优解B、构造最优解C、算出最优解D、子问题重叠性质29.下列算法中通常以自底向下的方式求解最优解的是 B ;A、分治法B、动态规划法C、贪心法D、回溯法30.采用广度优先策略搜索的算法是A ;A、分支界限法B、动态规划法C、贪心法D、回溯法31、合并排序算法是利用 A 实现的算法;A、分治策略B、动态规划法C、贪心法D、回溯法32、背包问题的贪心算法所需的计算时间为 BA、On2nB、OnlognC、O2nD、On33.实现大整数的乘法是利用的算法C ;A、贪心法B、动态规划法C、分治策略D、回溯法34.0-1背包问题的回溯算法所需的计算时间为AA、On2nB、OnlognC、O2nD、On35.采用最大效益优先搜索方式的算法是A;A、分支界限法B、动态规划法C、贪心法D、回溯法36.贪心算法与动态规划算法的主要区别是B;A、最优子结构B、贪心选择性质C、构造最优解D、定义最优解37. 实现最大子段和利用的算法是B ;A、分治策略B、动态规划法C、贪心法D、回溯法38.优先队列式分支限界法选取扩展结点的原则是 C ;A、先进先出B、后进先出C、结点的优先级D、随机39.背包问题的贪心算法所需的计算时间为 B ;A、On2nB、OnlognC、O2nD、On40、广度优先是A 的一搜索方式;A、分支界限法B、动态规划法C、贪心法D、回溯法41. 一个问题可用动态规划算法或贪心算法求解的关键特征是问题的 B ;A、重叠子问题B、最优子结构性质C、贪心选择性质D、定义最优解42.采用贪心算法的最优装载问题的主要计算量在于将集装箱依其重量从小到大排序,故算法的时间复杂度为 B ;A 、On2nB 、OnlognC 、O2nD 、On43. 以深度优先方式系统搜索问题解的算法称为 D ;A 、分支界限算法B 、概率算法C 、贪心算法D 、回溯算法44. 实现最长公共子序列利用的算法是B ;A 、分治策略B 、动态规划法C 、贪心法D 、回溯法45. Hanoi 塔问题如下图所示;现要求将塔座A 上的的所有圆盘移到塔座B 上,并仍按同样顺序叠置;移动圆盘时遵守Hanoi 塔问题的移动规则;由此设计出解Hanoi 塔问题的递归算法正确的为:B46. 动态规划算法的基本要素为 CA. 最优子结构性质与贪心选择性质 B .重叠子问题性质与贪心选择性质C .最优子结构性质与重叠子问题性质 D. 预排序与递归调用 47. 能采用贪心算法求最优解的问题,一般具有的重要性质为: AA. 最优子结构性质与贪心选择性质 B .重叠子问题性质与贪心选择性质C .最优子结构性质与重叠子问题性质 D. 预排序与递归调用48. 回溯法在问题的解空间树中,按 D 策略,从根结点出发搜索解空间树;A.广度优先B. 活结点优先C.扩展结点优先D. 深度优先49. 分支限界法在问题的解空间树中,按 A 策略,从根结点出发搜索解空间树;A.广度优先B. 活结点优先C.扩展结点优先D. 深度优先50. 程序块 A 是回溯法中遍历排列树的算法框架程序;A.B. C. D. 51. 常见的两种分支限界法为DA. 广度优先分支限界法与深度优先分支限界法;B. 队列式FIFO 分支限界法与堆栈式分支限界法;C. 排列树法与子集树法;D. 队列式FIFO 分支限界法与优先队列式分支限界法;1.算法的复杂性有 时间 复杂性和 空间 ;2、程序是 算法用某种程序设计语言的具体实现;3、算法的“确定性”指的是组成算法的每条 指令 是清晰的,无歧义的;4. 矩阵连乘问题的算法可由 动态规划 设计实现;5、算法是指解决问题的 一种方法 或 一个过程 ;6、从分治法的一般设计模式可以看出,用它设计出的程序一般是 递归算法 ;7、问题的 最优子结构性质 是该问题可用动态规划算法或贪心算法求解的关键特征;8、以深度优先方式系统搜索问题解的算法称为 回溯法 ;9、计算一个算法时间复杂度通常可以计算 循环次数 、 基本操作的频率 或计算步; Hanoi 塔A. void hanoiint n, int A, int C, int B{ if n > 0{ hanoin-1,A,C, B;moven,a,b; hanoin-1, C, B, A; }} B. void hanoiint n, int A, int B, int C { if n > 0 { hanoin-1, A, C, B; moven,a,b; hanoin-1, C, B, A; } }C. void hanoiint n, int C, int B, int A { if n > 0 { hanoin-1, A, C, B; moven,a,b; hanoin-1, C, B, A; } }D. void hanoiint n, int C, int A, int B { if n > 0 { hanoin-1, A, C, B; moven,a,b; hanoin-1, C, B, A; } } void backtrack int t{ if t>n outputx; else for int i=t;i<=n;i++ { swapxt, xi; if legalt backtrackt+1; swapxt, xi; } } void backtrack int t { if t>n outputx;elsefor int i=0;i<=1;i++ { xt=i; if legalt backtrackt+1; } }void backtrack int t { if t>n outputx; else for int i=0;i<=1;i++ { xt=i; if legalt backtrackt-1; } }voidbacktrack int t{ if t>n outputx; else for int i=t;i<=n;i++ { swapxt, xi; if legalt backtrackt+1;}}10、解决0/1背包问题可以使用动态规划、回溯法和分支限界法,其中不需要排序的是动态规划 ,需要排序的是回溯法 ,分支限界法 ;11、使用回溯法进行状态空间树裁剪分支时一般有两个标准:约束条件和目标函数的界,N皇后问题和0/1背包问题正好是两种不同的类型,其中同时使用约束条件和目标函数的界进行裁剪的是 0/1背包问题 ,只使用约束条件进行裁剪的是 N皇后问题 ;12、贪心选择性质是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别;13、矩阵连乘问题的算法可由动态规划设计实现;14.贪心算法的基本要素是贪心选择性质和最优子结构性质 ;15. 动态规划算法的基本思想是将待求解问题分解成若干子问题 ,先求解子问题 ,然后从这些子问题的解得到原问题的解;16.算法是由若干条指令组成的有穷序列,且要满足输入、输出、确定性和有限性四条性质;17、大整数乘积算法是用分治法来设计的;18、以广度优先或以最小耗费方式搜索问题解的算法称为分支限界法 ;19、贪心选择性质是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别;20.快速排序算法是基于分治策略的一种排序算法;21.动态规划算法的两个基本要素是. 最优子结构性质和重叠子问题性质 ;22.回溯法是一种既带有系统性又带有跳跃性的搜索算法;23.分支限界法主要有队列式FIFO 分支限界法和优先队列式分支限界法;24.分支限界法是一种既带有系统性又带有跳跃性的搜索算法;25.回溯法搜索解空间树时,常用的两种剪枝函数为约束函数和限界函数 ;26.任何可用计算机求解的问题所需的时间都与其规模有关;27.快速排序算法的性能取决于划分的对称性 ;28.所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到 ;29.所谓最优子结构性质是指问题的最优解包含了其子问题的最优解 ;30.回溯法是指具有限界函数的深度优先生成法 ;31.用回溯法解题的一个显着特征是在搜索过程中动态产生问题的解空间;在任何时刻,算法只保存从根结点到当前扩展结点的路径;如果解空间树中从根结点到叶结点的最长路径的长度为hn,则回溯法所需的计算空间通常为 Ohn ;32.回溯法的算法框架按照问题的解空间一般分为子集树算法框架与排列树算法框架;33.用回溯法解0/1背包问题时,该问题的解空间结构为子集树结构;34.用回溯法解批处理作业调度问题时,该问题的解空间结构为排列树结构;35.旅行售货员问题的解空间树是排列树 ;三、算法填空1.背包问题的贪心算法void Knapsackint n,float M,float v,float w,float x{//重量为w1..n,价值为v1..n的 n个物品,装入容量为M的背包//用贪心算法求最优解向量x1..nint i; Sortn,v,w;for i=1;i<=n;i++ xi=0;float c=M;for i=1;i<=n;i++{if wi>c break;xi=1;c-=wi;}if i<=n xi=c/wi;}2.最大子段和: 动态规划算法int MaxSumint n, int a{int sum=0, b=0; //sum存储当前最大的bj, b存储bjfor int j=1; j<=n; j++{ if b>0 b+= aj ;else b=ai; ; //一旦某个区段和为负,则从下一个位置累和 ifb>sum sum=b;}return sum;}3.贪心算法求活动安排问题template<class Type>void GreedySelector int n, Type s, Type f, bool A{A1=true;int j=1;for int i=2;i<=n;i++if si>=fj{ Ai=true;j=i;}else Ai=false;}4.快速排序template<class Type>void QuickSort Type a, int p, int r{if p<r{int q=Partitiona,p,r;QuickSort a,p,q-1; //对左半段排序QuickSort a,q+1,r; //对右半段排序}}5. 回溯法解迷宫问题迷宫用二维数组存储,用'H'表示墙,'O'表示通道int x1,y1,success=0; //出口点void MazePathint x,int y{//递归求解:求迷宫maze从入口x,y到出口x1,y1的一条路径mazexy=''; //路径置为if x==x1&&y==y1 success=1; //到出口则成功else{if mazexy+1=='O' MazePathx,++y;//东邻方格是通路,向东尝试if success&&mazex+1y=='O' MazePath++x,y;//不成功且南邻方格是通路,向南尝试if success&&mazexy-1=='O' MazePathx,--y;//不成功且西邻方格是通路,向西尝试if success&&mazex-1y=='O' MazePath--x,y;//不成功且北邻方格是通路,向北尝试}if success mazexy=''; //死胡同置为}四、算法设计题1. 给定已按升序排好序的n个元素a0:n-1,现要在这n个元素中找出一特定元素x,返回其在数组中的位置,如果未找到返回-1;写出二分搜索的算法,并分析其时间复杂度;template<class Type>int BinarySearchType a, const Type& x, int n{//在a0:n中搜索x,找到x时返回其在数组中的位置,否则返回-1Int left=0; int right=n-1;While left<=right{int middle=left+right/2;if x==amiddle return middle;if x>amiddle left=middle+1;else right=middle-1;}Return -1;}时间复杂性为Ologn2. 利用分治算法写出合并排序的算法,并分析其时间复杂度void MergeSortType a, int left, int right{if left<right {//至少有2个元素int i=left+right/2; //取中点mergeSorta, left, i;mergeSorta, i+1, right;mergea, b, left, i, right; //合并到数组bcopya, b, left, right; //复制回数组a}}算法在最坏情况下的时间复杂度为Onlogn;3.N皇后回溯法bool Queen::Placeint k{ //检查xk位置是否合法for int j=1;j<k;j++if absk-j==absxj-xk||xj==xk return false;return true;}void Queen::Backtrackint t{if t>n sum++;else for int i=1;i<=n;i++{xt=i;if 约束函数 Backtrackt+1;}}4.最大团问题void Clique::Backtrackint i // 计算最大团{ if i > n { // 到达叶结点for int j = 1; j <= n; j++ bestxj = xj;bestn = cn; return;}// 检查顶点 i 与当前团的连接int OK = 1;for int j = 1; j < i; j++if xj && aij == 0 // i与j不相连{OK = 0; break;}if OK { // 进入左子树xi = 1; cn++;Backtracki+1;xi = 0; cn--; }if cn+n-i>bestn { // 进入右子树xi = 0;Backtracki+1; }}5. 顺序表存储表示如下:typedef struct{RedType rMAXSIZE+1; //顺序表int length; //顺序表长度}SqList;编写对顺序表L进行快速排序的算法;int PartitionSqList &L,int low,int high //算法10.6b{//交换顺序表L中子表L.rlow..high的记录,枢轴记录到位,并返回其所在位置, //此时在它之前后的记录均不大小于它.int pivotkey;L.r0=L.rlow; //用子表的第一个记录作枢轴记录pivotkey=L.rlow.key; //枢轴记录关键字while low<high //从表的两端交替地向中间扫描{while low<high&&L.rhigh.key>=pivotkey --high;L.rlow=L.rhigh; //将比枢轴记录小的记录移到低端while low<high&&L.rlow.key<=pivotkey ++low;L.rhigh=L.rlow; //将比枢轴记录大的记录移到高端}L.rlow=L.r0; //枢轴记录到位return low; //返回枢轴位置}void QSortSqList &L,int low,int high{//对顺序表L中的子序列L.rlow..high作快速排序int pivotloc;if low<high //长度>1{pivotloc=PartitionL,low,high; //将L.rlow..high一分为二QSortL,low,pivotloc-1; //对低子表递归排序,pivotloc是枢轴位置 QSortL,pivotloc+1,high; //对高子表递归排序}}void QuickSortSqList &L{//对顺序表L作快速排序QSortL,1,L.length; }。

java动态计算公式(二)

java动态计算公式(二)Java动态计算公式1. 简介Java是一种面向对象的编程语言,拥有强大的数学计算能力和灵活的表达式计算功能。

在Java中,可以通过动态计算公式来实现对数学公式的求解和表达式的计算。

本文将介绍一些常见的Java动态计算公式,并提供相应的示例代码。

2. Java动态计算公式的实现方式使用Java内置的JavaScript引擎Java提供了内置的JavaScript引擎,可以通过该引擎解析和执行JavaScript代码,实现动态计算公式的功能。

以下是使用内置JavaScript引擎实现动态计算公式的示例代码:import ;import ;import ;public class DynamicFormulaExample {public static void main(String[] args) {ScriptEngineManager manager = new ScriptEngineMa nager();ScriptEngine engine = ("javascript");String formula = "2 + 3 * 4";try {Object result = (formula);("计算结果:" + result);} catch (ScriptException e) {();}}}上述示例代码中,我们使用了ScriptEngineManager类获取了一个JavaScript引擎,然后调用eval方法传入需要计算的公式,并将计算结果输出到控制台。

在这个示例中,我们计算了2 + 3 * 4的结果,输出结果为14。

使用第三方数学表达式引擎除了使用Java内置的JavaScript引擎外,还可以使用第三方的数学表达式引擎来实现动态计算公式的功能。

这些引擎通常提供了更多的数学函数和操作符,使得计算公式更加灵活和强大。

(求矩阵中所有数的和)编写一个方法,求整数矩阵中所有

1.(求矩阵中所有数的和)编写一个方法,求整数矩阵中所有整数的和,使用函数头如下:public static int sumMatrix(int[][] m)编写测试程序,读入一个4*4的矩阵,然后显示所有元素的和。

如下面的例子:输入一个4*4的矩阵:1 2 3 45 6 7 89 10 11 1213 14 15 16矩阵所有元素的和是: 1362.(求矩阵主对角线元素的和)编写一个方法,求n*n的整数矩阵中主对角线上所有整数的和,使用下面方法头:public static int sumMajorDiagonal(int[][] m)编写测试程序,读入一个4*4的矩阵,然后显示所有元素的和。

如下面的例子:输入一个4*4的矩阵:1 2 3 45 6 7 89 10 11 1213 14 15 16矩阵主对角线元素和是: 1363.(计算每个雇员每周工作的小时数)假定所有雇员每周工作的小时数存储在一个二维数组中,每行将一个雇员7天的工作时间记录在7列中。

例如:下面显示的数组存储了8个雇员的工作时间。

编写程序,按照总工时降序的方式显示雇员和他们的总工时.Su M T W H F SaEmployee0 2 4 3 4 5 8 8Employee1 7 3 4 3 3 4 4Employee2 4 5 6 4 2 5 6Employee3 5 3 4 3 2 1 9Employee4 3 2 1 5 6 3 3Employee5 4 2 5 6 7 9 1Employee6 2 1 1 1 9 4 2Employee7 3 3 3 2 6 7 84.(距离最近的点) 编写程序,让程序能够找出三维空间上距离最近的两个点。

使用一个二维数组表示这些点。

使用下面的点来测试这个程序:Double[][] points={{-1,0,3},{-1,-1,-1},{4,1,1},{2,0.5,9},{3.5,2,1},{3,1.5,3},{-1.5,4,2},{5.5,4,-0.5}};提示:计算两个点(x1,y1,z1) 和(x2,y2,z2)之间距离的公式是Math.sqrt((x1-x2)^2+(y1-y2)^2+(z1-z2)^)附加题:5.编写程序计算班级中每个学生的总分。

动态规划之最短路径源代码

动态规划之最短路径问题源代码#include "stdio.h"#include "conio.h"#define n 16 /*图的顶点数*/#define k 7 /*图的段数*/#define l 30#define MAX 100typedef int NodeNumber;/*节点编号*/typedef int CostType;/*成本值类型*/CostType cost[n][n];NodeNumber path[k];NodeNumber cur=-1;void creategraph(CostType *cost[n][n]) /*创建图的成本矩阵*/ {int i,j,x,y,value;for(i=0;i<n;i++)for(j=0;j<n;j++) cost[i][j]=0;printf("\nEnter the cost of graph:\n");for(i=0;i<l;i++){scanf("%d,%d,%d",&x,&y,&value);cost[x][y]=value;}}void outgraph(CostType *cost[n][n]) /*输出图的成本矩阵*/ {int i,j;printf("Print the cost of graph:\n");for(i=0;i<n;i++){for(j=0;j<n;j++) printf("%2d",cost[i][j]);printf("\n");}}/*使用向前递推算法求多段图的最短路径*/void FPath(CostType *cost[n][n],NodeNumber *path[k]) {int i,j,leng,temp,v[n],d[n];for(i=0;i<n;i++) v[i]=0;for(i=n-2;i>=0;i--){ leng=MAX;for(j=i+1;j<=n-1;j++)if(cost[i][j]>0 && (cost[i][j]+v[j])<leng){leng=cost[i][j]+v[j];temp=j;}v[i]=leng;d[i]=temp;}path[0]=0;path[k-1]=n-1;for(i=1;i<=k-2;i++) path[i]=d[path[i-1]]; }/*输出最短路径序列*/void outpath(NodeNumber *path[k]){int i;printf("\nPrint the shortest treet:\n");for(i=0;i<k;i++) printf("%3d",path[i]); }main(){NodeNumber m,t;creategraph(&cost);outgraph(&cost);FPath(&cost,&path);outpath(&path);}。

算法分析作业

算法分析练习题一一、选择题1、二分搜索算法是利用A 实现的算法;A、分治策略B、动态规划法C、贪心法D、回溯法2、下列不是动态规划算法基本步骤的是A ;A、找出最优解的性质B、构造最优解C、算出最优解D、定义最优解3.下列算法中通常以自底向上的方式求解最优解的是B ;A、备忘录法B、动态规划法C、贪心法D、回溯法4、衡量一个算法好坏的标准是C ;A 运行速度快B 占用空间少C 时间复杂度低D 代码短5、以下不可以使用分治法求解的是D ;A 棋盘覆盖问题B 选择问题C 归并排序D 0/1背包问题6. 实现循环赛日程表利用的算法是A ;A、分治策略B、动态规划法C、贪心法D、回溯法7.备忘录方法是那种算法的变形; BA、分治法B、动态规划法C、贪心法D、回溯法8.最长公共子序列算法利用的算法是B ;A、分支界限法B、动态规划法C、贪心法D、回溯法9.实现棋盘覆盖算法利用的算法是A ;A、分治法B、动态规划法C、贪心法D、回溯法10. 矩阵连乘问题的算法可由B设计实现;A、分支界限算法B、动态规划算法C、贪心算法D、回溯算法11、Strassen矩阵乘法是利用A 实现的算法;A、分治策略B、动态规划法C、贪心法D、回溯法12、使用分治法求解不需要满足的条件是A ;A 子问题必须是一样的B 子问题不能够重复C 子问题的解可以合并D 原问题和子问题使用相同的方法解13、下列算法中不能解决0/1背包问题的是AA 贪心法B 动态规划C 回溯法D 分支限界法14.实现合并排序利用的算法是A ;A、分治策略B、动态规划法C、贪心法D、回溯法15.下列是动态规划算法基本要素的是D ;A、定义最优解B、构造最优解C、算出最优解D、子问题重叠性质16.下列算法中通常以自底向下的方式求解最优解的是B ;A、分治法B、动态规划法C、贪心法D、回溯法17、合并排序算法是利用A 实现的算法;A、分治策略B、动态规划法C、贪心法D、回溯法18.实现大整数的乘法是利用的算法C ;A、贪心法B、动态规划法C、分治策略D、回溯法19. 实现最大子段和利用的算法是B ;A、分治策略B、动态规划法C、贪心法D、回溯法20. 一个问题可用动态规划算法或贪心算法求解的关键特征是问题的B ;A、重叠子问题B、最优子结构性质C、贪心选择性质D、定义最优解21. 实现最长公共子序列利用的算法是B ;A、分治策略B、动态规划法C、贪心法D、回溯法二、填空题1.算法的复杂性有时间复杂性和空间复杂性之分;2、程序是算法用某种程序设计语言的具体实现;3、算法的“确定性”指的是组成算法的每条指令是清晰的,无歧义的;4.矩阵连乘问题的算法可由动态规划设计实现;5、算法是指解决问题的一种方法或一个过程 ;6、从分治法的一般设计模式可以看出,用它设计出的程序一般是递归算法 ;7、矩阵连乘问题的算法可由动态规划设计实现;8. 动态规划算法的基本思想是将待求解问题分解成若干子问题 ,先求解子问题 ,然后从这些子问题的解得到原问题的解;9.算法是由若干条指令组成的有穷序列,且要满足输入、输出、确定性和有限性四条性质;10、大整数乘积算法是用分治法来设计的;11.快速排序算法是基于分治策略的一种排序算法;12.动态规划算法的两个基本要素是. 性质和性质 ;13.任何可用计算机求解的问题所需的时间都与其规模有关;14.快速排序算法的性能取决于划分的对称性 ;15、出自于“平衡子问题”的思想,通常分治法在分割原问题,形成若干子问题时,这些子问题的规模都大致相同 ;16、使用二分搜索算法在n个有序元素表中搜索一个特定元素,在最佳情况下,搜索的时间复杂性为O,在最坏情况下,搜索的时间复杂性为O logn ;17、已知一个分治算法耗费的计算时间Tn,Tn满足如下递归方程:解得此递归方可得Tn= O nlogn ;18、动态规划算法有一个变形方法备忘录方法 ;这种方法不同于动态规划算法“自底向上”的填充方向,而是“自顶向下”的递归方向,为每个解过的子问题建立了备忘录以备需要时查看,同样也可避免相同子问题的重复求解;19、递归的二分查找算法在divide阶段所花的时间是 O1 ,conquer阶段所花的时间是 Tn/2 ,算法的时间复杂度是 Ologn ;20、用动态规划算法计算矩阵连乘问题的最优值所花的时间是 On3 , 子问题空间大小是 On2 ;21、一个算法的优劣可以用时间复杂度与空间复杂度与来衡量;22、直接或间接地调用自身的算法称为递归算法;23、记号在算法复杂性的表示法中表示渐进确界或紧致界;24、在分治法中,使子问题规模大致相等的做法是出自一种平衡子问题的思想;25、动态规划算法适用于解具有某种最优性质问题;26、最优子结构性质的含义是问题的最优解包含其子问题的最优解;27、按照符号O的定义Of+Og等于Omax{fn,gn};28、二分搜索技术是运用分治策略的典型例子;29、动态规划算法中,通常不同子问题的个数随问题规模呈多项式级增长;30、最优子结构性质和子问题重叠性质是采用动态规划算法的两个基本要素;三、算法填空1.最大子段和: 动态规划算法int MaxSumint n, int a{int sum=0, b=0; 速排序template<class Type>void QuickSort Type a, int p, int r{if p<r {int q=Partitiona,p,r;QuickSorta,p,q-1 ; 最长上升子序列问题—— 提示:此题可采用动态规划算法实现对于给定的一个序列12(,,,)N a a a ,11000N ≤≤;我们可以得到一些递增上升的子序列12(,,,)i i iK a a a ,这里121K i i i N ≤<<<≤;比如,对于序列1, 7, 3, 5, 9, 4, 8,有它的一些上升子序列,如1, 7, 3, 4, 8等等;这些子序列中最长的长度是4,比如子序列1, 3, 5, 8;你的任务:就是对于给定的序列,求出最长上升子序列的长度;要求写出你设计的算法思想及递推函数的公式表达;.2.Gray码构造问题——提示:此题可采用分治递归算法实现问题描述:“格雷码”是一个长度为n2的序列,满足:a每个元素都是长度为n比特的串b序列中无相同元素c连续的两个元素恰好只有1个比特不同例如:n=2时,格雷码为{00,01,11,10};Gray码是一种编码,这种编码可以避免在读取时,因各数据位时序上的差异造成的误读;格雷码在工程上有广泛应用;但格雷码不便于运算,请你设计一种构造方法,输入长度序列n,输出格雷码你只要做出一种构造方案即可,格雷码并不唯一;3.现在有8位运动员要进行网球循环赛,要设计一个满足以下要求的比赛日程表:(1)每个选手必须与其他选手各赛一次;(2)每个选手一天只能赛一次;(3)循环赛一共进行n – 1天;请利用分治法的思想,给这8位运动员设计一个合理的比赛日程;4.对于矩阵连乘所需最少数乘次数问题,其递归关系式为:其中mi,j为计算矩阵连乘Ai…Aj所需的最少数乘次数,pi-1为矩阵Ai的行,ip为矩阵Ai的列;现有四个矩阵,其中各矩阵维数分别为:请根据以上的递归关系,计算出矩阵连乘积A1A2A3A4所需要的最少数乘次数;5.有这样一类特殊0-1背包问题:可选物品重量越轻的物品价值越高;n=6,c=20,P=4,8,15,1,6,3,W=5,3,2,10,4,8;其中n为物品个数,c为背包载重量,P表示物品的价值,W表示物品的重量;请问对于此0-1背包问题,应如何选择放进去的物品,才能使到放进背包的物品总价值最大,能获得的最大总价值多少6.归并排序算法对下列实例排序,写出算法执行过程;A=48,12,61,3,5,19,32,77.规则证明: Ofn+Ogn = Omax{fn,gn}8. 给定已按升序排好序的n个元素a0:n-1,现要在这n个元素中找出一特定元素x,返回其在数组中的位置,如果未找到返回-1;写出二分搜索的算法,并分析其时间复杂度;9. 利用分治算法写出合并排序的算法,并分析其时间复杂度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告4
课程 数据结构与算法 实验名称 动态规划 第 1 页
班级 11计本 学号 105032011130 姓名 刘川葆
实验日期:2013年3月25日 报告退发 (订正 、 重做)
一、实验目的
掌握动态规划策略的原理和应用。
二、实验环境
1、微型计算机一台
2、WINDOWS操作系统,Java SDK,Eclipse开发环境

三、实验内容
必做题:
1. 编写程序采用动态规划策略求解整数划分问题。
要求:输出给定整数n的划分个数。
2. 编写程序求解矩阵连乘问题,要求输出最优解。
要求:输出矩阵连乘最少需要的数乘次数,同时输出最优运算顺序,以A、
B、C、D四个矩阵连乘为例,输出最优解格式为:(A(B*C)*D)

四、实验步骤和结果
(附上代码和程序运行结果截图)
1.动态规划—整数划分
import java.util.Scanner;
public class ZSHF {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//键盘输入n
Scanner in=new Scanner(System.in);
System.out.println("input n:");
int n=in.nextInt();
//建立b数组存放动态规划结果
int b[][]=new int[n+1][n+1];//由于0行0列不用,故要加一
//进入划分函数
h_f_d(b);
//输出最后结果
System.out.println(b[n][n]);
}
private static void h_f_d(int[][] b) {
// TODO Auto-generated method stub
//初始化数组,对任何数不大于1的划分进行赋值
for(int i=1;ib[i][1]=1;
}
//对不大于其他值的划分的递推
for(int k=2;kfor(int l=k;lif(k==l)//应用书上的递推式组织函数
b[l][k]=1+b[l][k-1];
else if(l>k){
if(l-k>k)/*由于数组的另一半并没有赋值,故要对l-k?k的情况进
行分类*/
b[l][k]=b[l][k-1]+b[l-k][k];
else
b[l][k]=b[l][k-1]+b[l-k][l-k];
}
}
}
}

}

2动态规划—矩阵连乘
public class JZLC {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int p[]={30,35,15,5,10,20,25};//记录数组行列数量
int b[][]=new int[p.length][p.length];//记录连乘次数
int s[][]=new int[p.length][p.length];//记录最佳分割位置
matrixChain(b,p,s);
traceback(s,1,p.length-1);
System.out.println();
System.out.println(b[1][p.length-1]);
}

private static void traceback(int[][] s, int i, int j) {
// TODO Auto-generated method stub
//观察解的格式,发现如果只有单个的A,那么只要输出Ai,前后会有括号
//如果是连续的A,则规律是i+1=j,那么此时不要使用括号
//在分割点左边是用“(”,在分割点右边是用“)”,此时采用递归去求解使用括号的位置
if(i==j) System.out.print("A"+i);
else if(i+1==j) System.out.print("(A"+i+"*"+"A"+j+")");
else{
System.out.print("(");
traceback(s,i,s[i][j]);
traceback(s,s[i][j]+1,j);
System.out.print(")");
}
}

private static void matrixChain(int[][] b, int[] p, int[][] s) {
// TODO Auto-generated method stub
int n=p.length-1;
//初始化对角线的位置为0;
for(int i=1;i<=n;i++)
b[i][i]=0;
//开始进入
for(int r=2;r<=n;r++)//从2列开始确定对角线以外的值
for(int i=1;i<=n-r+1;i++){
int j=i+r-1;
//当k等于i时
b[i][j]=b[i+1][j]+p[i-1]*p[i]*p[j];
s[i][j]=i;
//当k不等于i时
int t=0;
for(int k=i+1;kt=b[i][k]+b[k+1][j]+p[i-1]*p[k]*p[j];
if(tb[i][j]=t;
s[i][j]=k;
}
}
}
}

}

五、实验总结
(本次实验完成的情况,心得体会)

相关文档
最新文档