算法分析与设计
课后作业整理
濡苏
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
图的m着色问题(第十二次实验)
图的m着色问题问题: 图的m着色问题。给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”。解析: 图着色问题描述为: 给定无向连通图G=(V, E)和正整数m,求最小的整数m,使得用m种颜色对G中的顶点着色.使得任意两个相邻顶点着色不同。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可原创 2021-06-22 20:28:29 · 691 阅读 · 0 评论 -
构造最优前缀的贪心算法(第十一次实验)
构造最优前缀的贪心算法问题:构造最优前缀的贪心算法,即哈夫曼算法解析:我们可以用一个数据结构维护所有数字的最小两个值,每次取最小的两个值就是序列,把这两个值累加到结果上,那么结果就是WPL设计:priority_queue<int, vector<int>, greater<int> >q; for(int i = 0; i < n; i++){ int x = rd(); q.push(x); }原创 2021-05-24 22:17:08 · 196 阅读 · 0 评论 -
LCS与背包问题(第九次实验)
问题:一、X = <x1, x2, x3,…xm>, Z=<z1, z2, z3,…zk>,如果存在X的元素构成的按下标严格递增序列<Xi1, Xi2, Xi3,…Xik>,使Xij = Zj, j= 1,2,3,…k那么 Z 是 X 的子序列,Z 含有的元素个数,称为子序列的长度。求最长。二、给定一个背包且给定其最大容量,现给定一系列物品,分别给定其体积和价值,请问背包里放入物品且所有物品体积和小于等于背包容量,求背包里物品价值和的最大值。解析:X=<A,原创 2021-05-17 20:43:43 · 320 阅读 · 1 评论 -
贪心算法和装载问题(第十次实验)
问题:一、n 项活动申请使用同一个礼堂,每项活动有一个开始时间和一个截 止时间。如果任何两个活动不能同时举行,问如何选择这些活动,从而使得被安排的活动数量达到最多。二、给你一个空间,告诉你这个空间的最大储存空间,告诉你一系列物品且知道每件物品的价值和占用空间,每件物品只能取一遍,问这个这个存储空间存放的东西价值和最大是多少。解析:一、把活动按照截止时间进行升序排序,然后从前往后遍历,只要该活动与前面的活动没有结合的就可以选入。二、0/1背包问题伪代码设计:一、A = {1}J = 1Fo原创 2021-05-17 16:36:20 · 435 阅读 · 0 评论 -
矩阵链乘法(第八次实验)
问题:n个矩阵序列,确定一种计算次序使得运算的总次数最少。解析:Ai…j:表示矩阵链相乘的子问题Ai,Ai+1…Aj;M[i…j]:表示得到乘积Ai…j所用的最少基本运算次数;假设,最后一次相乘发生在矩阵链Ai…k和Ak+1…j之间,即AiAi+1…Aj=(AiAi+1…Ak)(Ak+1Ak+2…Aj) k=i,i+1,…,j-1伪代码 :For r=2 to n do For i=1 to n-r+1 do J=i+r-1 m[i,k]=m[i+1,j]+Pi-1PkPj S[原创 2021-05-06 21:14:04 · 272 阅读 · 0 评论 -
投资问题(第七次实验)
问题: 给你m万元和n个投资项目,每个项目投资不同的钱会有不同的回报。解析: 因为每个项目投资不同的钱会有不同的收益,所以我们可以将每个项目投资不同的钱看成不同的个体(因为每个项目投资不同的钱和回报之间没有联系),同时同一项目同一付出投资都是一份的,所以我们可以将拆分后的问题转化为0/1背包问题,即有m万元和n*m个项目,告诉你每个分解后项目的付出和回报。设计:for(0 -> n*m) for(m - > cost[i]) dp[j] = max(dp[j], dp[j - cos原创 2021-04-25 17:44:42 · 268 阅读 · 0 评论 -
选第k小元素:特定分治策略(第六次实验)
问题: 选择第k小元素,特定分治策略解析:代码:#include<bits/stdc++.h>using namespace std;const int maxn = 1e3 + 10;int rd(){ int x; scanf("%d", &x); return x;}int n, k;int selectK(vector<int> &v, int k){ vector<int>groupMi原创 2021-04-19 22:22:40 · 156 阅读 · 0 评论 -
告诉一系列同一平面上的点,求最近点对(第五次实验)
问题:告诉一系列同一平面上的点,求最近点对。解析:1暴力算法,遍历每一个点对的距离求出最小值2分治算法,根据中位点二分左右区间得到最短距离,然后对区间[mid - d, mid + d]求最短距离,两值取小,不断递归。对于最近对问题最容易最直接想到的就是蛮力算法,我们可以得到每两个点的距离求最小值,但这样的时间复杂度较高。我们可以采用分治的想法解决这一问题,将复杂难问题转化为简单问题解决。但是最短点对可能出现在中位点的左右两侧,所以我们还需要求出中间区间的最短点对。设计:#include &l原创 2021-04-12 16:35:32 · 168 阅读 · 0 评论 -
对一个无序数组进行二分归并排序(第四次作业)
对一个无序数组进行二分归并排序问题:对一串无序的数组进行二分归并排序解析:我们可以进行递归的方式尽心二分归并排序,为了方便起见这里实现的是升序的排序。我们可以对一串数组进行二分一直到容量为1的时候开始往上递归,往上递归的时候我们得到的两个区间总是升序的,合并这两个数组时我们只需要使用归并排序就可以了,这样我们就可以得到一个有序的大区间。为了实现修改原数组,我们在中间先放一个容器来暂存数组内容,实现合并后将该容器里的数字全部放回原数组,这就达到了修改原数组的效果。设计:void merge_so原创 2021-03-29 15:51:42 · 504 阅读 · 0 评论 -
在排好序的数组中使用两种不同的方法获取目标数字的索引(第三次作业)
在排好序的数组中使用两种不同的方法获取目标数字的索引问题:在排序好的数组中使用两种不同的方法获取目标数字的索引,如果不存在返回0。解析:在一个数组里面查找一个数字的方法最直接的就是使用暴力的方法进行搜索,遍历每一个数组查询到目标数字即可返回。因为这个数组是排好序的,所以我们便可以使用二分搜索的方法来查找这个数字。(便于操作我们令得到的数组是升序排序的)设计:(1)暴力算法: For(数组){ If(arr[i] == x){ return i; 退出 }}Return 0;(原创 2021-03-22 15:43:41 · 255 阅读 · 1 评论 -
用Floyd算法和Dijkstra算法分别求多源最短路径和单源最短路径(第二次作业)
用Floyd算法和Dijkstra算法分别求多源最短路径和单源最短路径。问题:用Floyd算法求解下图各个顶点的最短距离。写出Floyd算法的伪代码和给出距离矩阵(顶点之间的最短距离矩阵)。对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径,按实验报告模板编写算法。解析:用Floyd算法求解题一,我们用三重循环进行判断,当然我们可以进行相应的减枝,不用对无效的数据即没有连通的点算最短距离。用Dijkstra算法求解题二,我们可以用优先队列优化问题,获取最短边的时候可以降低复杂度,因原创 2021-03-15 16:03:54 · 503 阅读 · 0 评论 -
分别采用prim算法与kruskal算法构造最小生成树(第一次作业)
分别采用prim算法与kruskal算法构造最小生成树1.问题举一个实例,画出采用Prim算法构造最小生成树的过程,并按实验报告模板编写算法。举一个实例,画出采用Kruskal算法构造最小生成树的过程,并按实验报告模板编写算法。有n个村庄需要修通道路,已知每两个村庄之间的距离,问怎么修路,使得所有村庄都连通(但不一定有直接的公路相连,只要能间接通过公路到达即可),并且道路总长度最小?请计算最小的公路总长度。2.解析令一张连通图的点集为V,未标记的点集合为V1;V1 = V;Prim算法的核心原创 2021-03-08 22:17:20 · 2014 阅读 · 0 评论
分享