自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 收藏
  • 关注

原创 圆排列问题

圆排列问题:给定n个圆的半径序列,将它们放到矩形框中,各圆与矩形底边相切, 求具有最小排列长度的圆排列。 圆的摆放位置不同【先后顺序不同】,得到的结果可能不同,所以这是一个排列问题,在回溯里面需要添加全排列的代码 要得到圆排列的长度,我们需要知道最右边圆心的横坐标,+它的半径+第一个圆的半径【根据算法的约定,第一个圆的圆心横坐标为0,代码中有标记】 那么我们如何计算当前圆的横坐标,根据递归的思想,第n个圆的圆心横坐标=与他相切的圆的横坐标+2*sqrt(r[n]*r[n-1])由[(r1+r2)^2 -(r

2020-06-04 19:15:39 738

原创 图的m着色问题

图的m着色问题。给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个 顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方 案;如果不存在,则回答“NO”。 可以通过回溯的方法,不断的为每一个节点着色,在前面n-1个节点都合法的着色之后,开始对第n个节点进行着色,这时候枚举可用的m个颜色,通过和第n个节点相邻的节点的颜色,来判断这个颜色是否合法,如果找到那么一种颜色使得第n个节点能够着色,那么说明m种颜色的方案是可行的。 https://github.com/wtyn5/suan

2020-06-03 23:35:32 193

原创 最优前缀

最优前缀编码,参见讲义8.4,也可参见课本“9.4哈夫曼树及编码”,正确性证明部分 选做。 哈夫曼编码 为每个符号建立一个叶子节点,并加上其相应的发生频率 当有一个以上的节点存在时,进行下列循环: 把这些节点作为带权值的二叉树的根节点,左右子树为空 选择两棵根结点权值最小的树作为左右子树构造一棵新的二叉树,且至新的二叉树的根结点的权值为其左右子树上根结点的权值之和。 把权值最小的两个根节点移除 将新的二叉树加入队列中. 最后剩下的节点暨为根节点,此时二叉树已经完成。 https://github.com/w

2020-06-03 23:05:28 164

原创 相容问题

相容问题,解析时给出其他几种贪心策略(如按开始时间从小到大、每个活动时间的 占用时间等),并给出这些贪心策略无法实现最优的反例。 把活动按照截止时间从小到大排序,然后从前向后挑选,只要与前面选的活动相容,就选入A #include <stdio.h> struct activity{ int start; int end; int time; }A[130]; void sort(activity A[],int n) { for (int i = 0; i < n - 1; i+

2020-06-03 22:30:24 353

原创 最长公共子序列

最长公共子序列问题(Longest Common Subsequence,LCS),给定序列在这里插入图片描述,求 X 和 Y 的最长公共子序列 Xi=<x1,x2,…,xi> Yj=<y1,y2,…,yj> Zk=<z1,z2,…,zk> 如果Zk是Xi和Yj的最长公共子序列 (1)xi = yj,那么zk = xi = yj,Zk-1是Xi-1和Yj-1的最长公共子序列 (2)xi ≠ yj,那么zk ≠ xi,Zk-1是Xi-1和Yj的最长公共子序列 (3)xi ≠

2020-06-03 21:40:20 120

原创 矩阵链乘法

矩阵链乘法,特别要求举例时采用不同于讲义的数据进行推导 矩阵A和矩阵B能够相乘,只有当矩阵A和矩阵B相容。矩阵链乘法的前提就是降低矩阵的乘法规模。之所以可以这样,是因为矩阵相乘满足结合律。我们可以这样去想,我们使用使用一个分割线,把矩阵链分成两份,一份左,一份右,如果左右的矩阵链的乘法次数最少,那么分割线处的乘法次数有如下等式: #include <stdio.h> void print(int s[][100], int i, int j) {//括号化方案 if (i == j) {

2020-05-23 00:09:44 183

原创 投资问题

设m元钱,n项投资,函数fi(x)表示将x元投入第i项项目所产生的效益,i=1,2,…,n 问:如何分配这m元钱,使得投资的总效益最高? 动态规划问题一般分为两类:中间状态类和累积状态类。前者的参数是相同的,后者的参数不同,而且往往需要一个变量来进行遍历。这个问题以及最少货币数的问题都属于后者,最长公共子序列和最小路径和都属于前者。 int main() { int m, n;//m元钱,n项投资 int i, j; int tmp_m, tmp_F = 0, t = 0;//tem_m代表给第i个项

2020-05-22 23:43:03 613 1

原创 特定分治策略

在一个数组S中查找第k小的元素并输出。 把n 分为五个一组,取每组中位数并排序,按照mm对数组进行划分,比mm小,比mm大,和mm相同的,第k小元素在哪块区域,对该区域再次递归调用本算法 typedef pair<int, int> pairs; /* * 选择第k小元素 */ int Select(vector<int> a, int k)//需要保证k的范围合理 { int temp1 = a.size(); vector<int>::i

2020-05-22 23:27:59 140

原创 最近点对问题

问题描述:平面上有n个点P1,P2,…,Pn,n>1,Pi的直角坐标为(Xi,Yi),i=1,2,…,n.求距离最近的两个点及他们之间的欧几里得距离。 解析:暴力直接通过两点距离差公式求距离并遍历比较 分治将所有点分为两批,都为n/2,然后分别进行递归 //最近点对问题,蛮力法实现(C++) #include<stdlib.h> #include<stdio.h> #include<iostream> #include<math.h> #define M

2020-05-22 22:55:05 726

原创 二分归并排序

二分归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k; #include<stdio.h> #include<stdlib.h> #define MAX 10 void mergearray(int A[], int first, int mid, int last, int temp[]) { int i = first, j = mid + 1; int m = mid, n = last; int k = 0; while (i <= m

2020-05-22 20:46:17 123

原创 检索算法

在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在 T的下标j;如果x不在T中,输出j=0.按实验模板编写,“分析”部分仅给出复杂度 结果即可。 #include<stdio.h> #include<stdlib.h> #define MAX 100 void left(int T[], int a) { if (T[a] == T[a - 1]) { printf("%d\n", a - 1); return left(T, a - 1); } } voi

2020-05-22 18:17:29 349

原创 使用Dijkstra算法求由顶点a到顶点h的最短路径

通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。 此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。 初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是”起点s到该顶点的路径”。然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。 然后,再从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。.

2020-05-22 15:14:32 4005

原创 Floyd算法求解各个顶点的最短距离

用Floyd算法求解下图各个顶点的最短距离。写出Floyd算法的伪代码和给出距离矩 阵(顶点之间的最短距离矩阵)。 用D[v][w]记录每一对顶点的最短距离。依次扫描每一个点,并以其为基点再遍历所有每一对顶点D[][]的值,看看是否可用过该基点让这对顶点间的距离更小。 ...

2020-05-22 13:45:32 695

原创 Kruskal算法构造最小生成树

将图中的所有边都去掉。将边按权值从小到大的顺序添加到图中,保证添加的过程中不会形成环重复上一步直到连接所有顶点,此时就生成了最小生成树。 选择最小边v1-v3 选择最小边 此时可选择v1-v4 v3-v4 v2-v3 但是另外两个选择形成回路,因此选择v2-v3 #include <stdio.h> #define MAXE 100 #define MAXV 100 typedef struct{ int vex1; //边的起始顶点 int

2020-05-22 12:56:38 1213 1

原创 prim算法构造最小生成树

假设G=(V,E)是连通的,TE是G上最小生成树中边的集合。算法从U={u0}(u0∈V)、TE={}开始。重复执行下列操作: 在所有u∈U,v∈V-U的边(u,v)∈E中找一条权值最小的边(u0,v0)并入集合TE中,同时v0并入U,直到V=U为止。 此时,TE中必有n-1条边,T=(V,TE)为G的最小生成树。 #include #include #include #include using namespace std; const int maxn=1005; const int INF=0

2020-05-22 12:12:32 3676

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除