- 博客(14)
- 收藏
- 关注
原创 期末大作业
期末大作业1.问题给定一个源串和目标串,能够对源串进行如下操作:在任意位置上插入一个字符;替换任意字符;删除任意字符。写一个程序,实现返回最小操作次数,使得对源串进行上述这些操作后等于目标串(源串和目标串的长度都小于2000)。2.解析假设源字符串为word1,目标串为word2。由于我们的目的求将 word1 转换成 word2 所使用的最少操作数。那我们就定义dp[i] [j]的含义为:当字符串word1的长度为 i,字符串word2的长度为j时,将word1转化为word2所使用的最少
2021-06-10 18:41:22 136
原创 实验十二着色问题
实验十二1.问题给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”。2.解析四色猜想:四色问题是m图着色问题的一个特例,根据四色原理,证明平面或球面上的任何地图的所有区域都至多可用四种、颜色来着色,并使任何两个有一段公共边界的相邻区域没有相同的颜色。这个问题可转换成对一平面图的4-着色判定问题(平面图是一个能画于平面上而边无任何交叉的图)。将地图的每个区域变成一个结点,若两个区域相邻,则相
2021-06-07 16:50:23 164
原创 实验十一
实验十一1.问题代码(码字):Q {001,00,010,01}表示字符 a, b, c, d同一序列:0100001产生两种译码(产生歧义):01 00 001; 010 00 012.解析构造最优前缀码的贪心算法就是哈夫曼算法(Huffman)3.设计代码实现:#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespac
2021-05-24 16:24:40 90
原创 实验十
实验十1.问题有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。2.解析思路:轻者先装,直到再装任何集装箱将使轮船载重量超过 C 时停止。证明:I 必然是 N 的最优解,采用反证法,即假设 I 不是 N 的最优解。3.设计#include<stdio.h>#include<stdlib.h>void outputResult(int* r, int len) { pr
2021-05-17 16:23:26 60
原创 实验九背包问题
实验九背包问题1.问题有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?2.解析代码如下(示例):Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积,定义V(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值。1.建立模型,即求max(V1X1+V2X2+…+VnXn);2、寻找约束条件,W1X1+W2X2+…+WnXn<capacity;3、寻找递推关系式,面对当前商品有两种可能性:包的容量比该商品体积小,装不下,此时
2021-05-10 17:21:55 79
原创 实验九LCS问题
实验九LCS问题1.问题求两个序列的最长公共子序列(LCS)。2.解析设X=<x1,x2,x3,x4…,xm>,Y=<y1,y2,y3,y4…,yn>为两个序列,Z=<z1,z2,z3,z4…,zk>是他们的任意公共子序列经过分析,我们可以知道:1、如果xm = yn,则zk = xm = yn 且 Zk-1是Xm-1和Yn-1的一个LCS2、如果xm != yn 且 zk != xm,则Z是Xm-1和Y的一个LCS3、如果xm != yn 且 zk !=
2021-05-10 15:58:57 59
原创 实验八
实验八1.问题设A1, A2, A3…, An为n个矩阵序列,其中Ai为Pi-1 * Pi阶矩阵,这个矩阵链的输入用向量P=< P0, P1,…,Pn>给出,给定向量,确定一种乘法次序,使得基本运算的总次数达到最小。2.解析3:设计4.分析5.源码链接:源代码...
2021-05-07 13:44:25 69
原创 实验七
实验七1.问题设m元钱,n项投资,函数fi(x)表示将x元投入第i项项目所产生的效益,i=1,2,…,n。问:如何分配这m元钱,使得投资的总效益最高?2.解析假设分配给第i个项目的钱数是xi,问题描述为:目标函数:max{f1(x1)+ f2(x2)+…+ fn(xn)}约束条件:x1 +x2 +…+xn=m,xi∈N实例:设Fk(x)表示x万元投给前k个项目的最大效益,k=1,2,…,n, x=1,2,…,m。设给第k个项目投资xk万元,故投资给前k-1的项目资金为(x-xk)万元
2021-04-26 16:58:06 135
原创 实验六
实验六1.问题在长度为N的乱序数组中寻找第K(N>=k)小的元素2.解析用分治的策略,首先选择一个基准数也称为枢纽元,通过一趟排序将数组分割成独立的两部分,枢纽元左边的数都不大于它,枢纽元右边的数都不小与它,记他的位置为mid。如果左半边的长度刚好为K,说明mid下标对应的元素就是第K小元素;如果左边的长度大于K,那么说明第K小的元素在左半边,往左半边寻找。如果左边的长度小于K,那么说明第K小的元素在右半边,往右半边寻找。3.设计select函数:int select(int a[],i
2021-04-19 20:08:20 78
原创 实验五
实验五1.问题对于平面上n>1个点,求最近点对之间的欧几里得距离。2.解析当2≦n≦3时可以用蛮力算法求解。当n>3时,可以利用点集在x轴方向上的中位数m,在该处做一条垂线,将点集分成两个子集,然后通过递归求解子问题来得到最近点对问题的解。还需考虑边界线m两边的点之间的距离是否小于求得的最短距离。3.设计伪代码:EfficientClosestPair(P,Q)//输入:数组P中存储了平面上的n>=2个点,并// 数组Q存储了与P相同的点,只是它是按照这点的Y轴
2021-04-14 14:29:23 55
原创 实验四
实验四1.问题用二分归并排序对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k。2.解析每次用分治的思想将数组进行二分操作,然后从下往上开始进行合并排序。3.设计算法主要由两个函数组成归并函数:void MergeStep(int a[], int r[], int low, int mid, int high) { //归并函数 int i = low; int j = mid + 1; int m = mid; int n = high; int k =
2021-03-31 16:12:11 72
原创 实验三
实验三 1.问题写出两种检索算法查找排序好的T序列中的x,若x在T中则输出它的下标,不在则输出0。2.解析顺序查找算法:遍历T数组,把每个元素与x进行比较,若相等则返回下标,遍历完数组仍未找到则查找失败。折半查找算法:首先计算数组的中间元素序号mid,用t[mid]与x比较,若相等则返回mid;若t[mid]>x。则在mid序号的前半部分查找 ;若t[mid]<x,则在数组的后半部分查找。3.设计顺序查找:int SeqSearch(int t[], int key, int
2021-03-22 16:40:45 45
原创 实验二
实验二一:问题*用Floyd算法求解各个顶点的最短距离;用Dijkstra算法求由顶点a到顶点h的最短路径。二:解析Floyd算法:创建一个原始的邻接矩阵A[i][j],然后依次插入图的各个顶点k,当A[i][j]>A[i][k]+A[k][j]时就把矩阵对应的值更新,遍历完所有顶点后得到的A矩阵就是各点的最短距离矩阵。Dijkstra算法:先建立顶点集合U,初始化时集合内只有一个顶点V0,以后陆续将已求得最短路径的顶点加入集合U中,当全部顶点进入该集合时,完成求解过程。三:设计头文
2021-03-19 17:56:47 57
原创 实验一
实验一一:问题分别用Prim算法和Kruskal算法构造最小生成树二:解析Prim算法:图中所有的点构成V集合,另外再设一个U集合用来存放最小生成树的顶点。首先从V集合中任意取出一个点V0,将其加入到U集合中,从V0的邻接点中选择点Vn,使V0,Vn边的权值最小,得到最小生成树的一条边,将Vn加入U集合。接着再加入一个顶点,重复上述步骤,最后即可得到一棵最小生成树。实例如下图:Kruskal算法:把图中所有的边按照权值先从大到小排列,接着按照这个顺序选取每条边,如果这条边的两个端点不属
2021-03-11 21:12:35 56
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人