- 博客(20)
- 收藏
- 关注
原创 贪心算法入门
贪心算法入门1.何为贪心贪心算法实际上指的是把问题划分成一个一个的子问题,然后针对当前的子问题,求出局部最优解,然后将子问题的最优解合并,最终获得总问题的最优解。由于贪心算法主要考虑的是部最优解,所以它并不能对于所有的问题得出全局最优解,这就要求选择的贪心策略必须具备无后效性,即以前各阶段的状态无法直接影响它未来的决策,只与当前状态有关。所以对所采用的贪心策略一定要先分析其是否满足无后效性。2.贪心算法的基本思路:1.建立数学模型来描述问题。2.把求解的问题分成若干个子问题3.求解子问题得出
2021-01-25 23:59:35 195
原创 算法分析与设计实践-大作业-圆排列问题
圆排列问题1.问题给定n个圆的半径序列,将它们放到矩形框中,各圆与矩形底边相切,求具有最小排列长度的圆排列。2.解析圆排列问题的解空间是一棵排列树。按照回溯法搜索排列树的算法框架,设开始时a=[r1,r2,……rn]是所给的n个元的半径,则相应的排列树由a[1:n]的所有排列构成。定义一个函数center()来计算圆在当前圆排列中的横坐标,可得x^2 = sqrt((r1+r2)2-(r1-r2)2) 即:x = 2sqrt(r1r2)。定义一个函数compute()来计算当前圆的排列长
2020-06-15 23:25:46 389
原创 算法分析与设计实践-作业13-Note
Note(读书笔记)在大一刚参加学院的ACM竞赛团队时,学长就向我们推荐了《算法竞赛进阶指南》,这本书内容还是比较多的,开始有一些基础算法知识,二分、排序、贪心、搜索等,也涵盖了部分省选知识点像一些网络流算法,对于DP的优化:斜率优化DP,四边形不等式优化DP等。到目前为止,我虽然还没完全掌握这些算法,但是还是掌握了一些在做题中比较常用的算法的。算法最主要的是尽可能去降低解决问题的复杂度,比如有一个问题,需要判定字符串A[1N]是否为字符串B[1M]的子串,并要求出字符串A在字符串B中各次出现的位置。如
2020-06-10 23:44:15 187
原创 算法分析与设计实践-作业12-图的m着色问题
图的m着色问题1.问题图的m着色问题。给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”。2.解析分析可知,该问题的解空间树是一棵完全m叉树,每一层中的每一结点都有m个儿子(即m种不同的着色方案)。定义数组color [n]存储可行解,二维数组中元素c[i][j]表示顶点i和j是否连通(1连通0不连通)使用回溯法,具体步骤是将x=1传入函数backtrack,即从第一个开始涂色。涂的
2020-06-01 21:43:49 605
原创 算法分析与设计实践-作业11-哈夫曼编码
哈夫曼编码1.问题代码(码字):Q{001,00,010,01}表示字符a,b,c,d同一序列:0100001产生两种译码(产生歧义):01 00 001;010 00 01二元前缀码:任何字符的代码不能作为其他字符代码的前缀利用二元前缀码译码:从第一个字符开始一次读入每个字符(0或1),如果发现独到的字串与某个码字相等,就将这个子串译作相应的码字:然后从下一个字符开始继续这个过程,直到读完输入的字符串为止。二元前缀编码存储:二叉树结构,每个字符作为树叶,对应这个字符的前缀码看作根到这片树叶的
2020-05-18 22:02:26 540
原创 算法分析与设计实践-作业10-贪心算法之相容问题
贪心算法之相容问题1.问题有n项活动申请使用同一个礼堂,每项活动有一个开始时间和一个截止时间。如果任何两个活动不能同时进行,问如何选择这些活动,从而使得被安排的活动数量达到最多。2.解析贪心策略1:活动按结束时间进行升序排序选择活动:1,4,8 最多数量:3最优策略贪心策略2:活动按开始时间进行升序排序选择活动:1,5 最多数量:2不是最优策略贪心策略3:按活动占用时...
2020-05-04 21:49:52 407
原创 算法分析与设计实践-作业9-动态规划之最长公共子序列问题
动态规划之最长公共子序列问题(LCS)1.问题给定序列X=<x1, x2,…, xm>,Y=< y1, y2,…, yn>,求X和Y的最长公共子序列。2.解析设X=<x1,x2,…,xm>,Y=<y1,y2…,yn>为两个序列,Z=<z1,z2,…,zk>是他们的任意公共子序列。经过分析可得:1、xi = yj,那么zk = ...
2020-04-27 23:28:33 519
原创 算法分析与设计实践-作业8-动态规划之矩阵链乘法
动态规划:矩阵链乘法1.问题设A1,A2,… ,An为n个矩阵的序列,其中Ai为Pi-1*Pi阶矩阵,这个矩阵链 的输入用向量P=<P0,P1,… ,Pn>给出。给定向量P,确定一种乘法次序,使得基本运算的总次数达到最小。2.解析对于矩阵链乘法问题,我们将所有对于1≤i≤j≤n确定A i A i+1 …A j 的最小代价括号方案作为子问题。令m[i,j]表示计算矩阵A i,...
2020-04-20 21:30:31 388
原创 算法分析与设计实践-作业7-动态规划投资问题
动态规划:投资问题1.问题设m元钱,n项投资,函数f[i][x]表示将x元投入第i项项目所产生的效益,i=1,2,…,n.问:如何分配这m元钱,使得投资的总效益最高。2.解析设F[k][x]表示x万元投给前k个项目的最大效益,k=1,2,…,n,x=1,2,…,m。递推方程:F[k][x]=max{f[k][j]+F[k-1][x-j]}, 0<=j<=x , k=1,2,…...
2020-04-13 22:49:04 402
原创 算法分析与设计实践-作业6-分治求第k小元素
选第k小元素:特定分治策略1.问题在给定的n个数中找出第k小的数2.解析3.设计void select(vector<int>s,int n,int k) { vector<int>t,m; t=s; //每5个元素分为一组 ,把中位数放入数组m int len=5; for(int i=0;i<n;i+=5){ if(n-i+1<...
2020-04-06 22:12:30 377
原创 算法分析与设计实践-作业5-分治最近对问题
用分治解决最近对问题1.问题有n个点在公共空间中,求出所有点对的欧几里得距离最小的点对。欧几里得距离计算公式:2.解析将集合S分成两个子集S1和S2,根据平衡子问题原则,每个子集中的点数大致都为n/2。这样分治后,最近点对将会出现三种情况:在S1中,在S2中或者最近点对分别在集合S1和S2中。利用递归分析法分别计算前两种情况,第三种方法另外分析。求解出三类子情况后,再合并三类情况,比较...
2020-03-30 22:59:24 296
原创 算法分析与设计实践-作业4-二分归并排序
二分归并排序1.问题对 n 个不同的数构成的数组 A[1…n]进行排序,其中n = 2k。2.解析二分归并排序首先就是将原问题归结为规模为n/2的2个子问题,继续划分,将原问题归结为规模为n/4的4个子问题,继续划分,当子问题规模为1时,划分结束。(1)MergeSort(A,p,r)从规模1到n/2,陆续归并被排好序的两个子数组。每归并一次,数组规模扩大一倍,直到原始数组。(2)...
2020-03-23 22:24:40 301
原创 算法分析与设计实践-作业3-2-二分查找
二分查找1.问题在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0.2.解析将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为...
2020-03-16 23:15:27 95
原创 算法分析与设计实践-作业3-1-顺序查找
顺序查找1.问题在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0.2.解析顺序查找就是对于任意一个序列以及一个给定的元素,将给定元素与序列中元素依次比较,直到找出与给定关键字相同的元素,或者将序列中的元素与其都比较完为止。3.设计j=0;//j初始为0for(i from 1 to n){ if(x==T[i]){ //找到x用...
2020-03-16 23:11:58 270
原创 算法分析与设计实践-作业2-2-用Dijkstra算法解决最短路问题
用Dijkstra算法解决最短路问题1.问题对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径。2.解析若设1号点(a点)为起点,求长度为n的数组d,其中d[i]表示从起点到节点i的最短路径的长度。那么顶点a到顶点h的最短距离即为d[n]。Dijkstra算法的流程如下:初始化d[1]=0,其余节点的d数组的值为无穷大。找出一个未被标记的、d[x]最小的节点x,然后...
2020-03-09 21:23:52 496
原创 算法分析与设计实践-作业2-1-用Floyd算法解决最短路问题
用Floyd算法解决最短路问题1.问题用Floyd算法求解下图各个顶点的最短距离,并给出距离矩阵(顶点之间的最短距离矩阵)。
2020-03-09 21:14:20 281
原创 算法分析与设计实践-作业1-2-Kruakal构造最小生成树
Kruskal算法构造最小生成树1.问题给定一张边带权的无向图G = (V,E) , n =|V| , m = |E| 。由V中全部n个顶点和E中n-1条边构成的无向连通子图被称为G的一棵生成树。边的权值之和最小的生成树被称为无向图G的最小生成树。2.解析3.设计void kruskal(){ sort(edge,edge+m,cmp);//将边的权值排序 for(...
2020-03-02 21:22:56 264 1
原创 算法分析与设计实践-作业1-1-Prime构造最小生成树
Prime算法构造最小生成树1.问题给定一张边带权的无向图G = (V,E) , n =|V| , m = |E| 。由V中全部n个顶点和E中n-1条边构成的无向连通子图被称为G的一棵生成树。边的权值之和最小的生成树被称为无向图G的最小生成树。2.解析...
2020-03-02 21:15:21 597
原创 2020寒假综合训练赛(C、D)
C题 Psychos in a Line CodeForces - 320D博客链接:https://blog.csdn.net/zvenWang/article/details/84714945题意:就是给定一行精神病人,他们每个人都有自己的某种数值,如果当前位置的右侧的人的数值小于它,那么它会杀死它右侧的那个人,且存在连续杀性质(能够将这个性质在一个时间单位下进行传递)思路:发现这其实是...
2020-02-04 13:16:07 212
原创 2020寒假并查集训练赛(C、D、G)
C题: Destroying Array codeforces 772C题意:给出一个长度为n的序列,每次删除一个(删除之后序列断开),求最大连续子段和。思路:可以逆向来考虑,每次添加一个数,只有可能把他左边或右边的那两个数连接起来,所以用一个标记来判断相邻的两个数是否在之前已被添加,如果被添加,用并查集把这两个点合并,然后更新最大值。附上代码:#include<cstdio&g...
2020-01-13 16:01:05 155
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人