![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
经典算法
文章平均质量分 81
PG13okc
一个不会编程的菜鸟!
展开
-
回溯算法 --- 例题6.最大团问题
一.问题描述给定无向图G=(V, E), U⊆V, 若对任意u, v∈U, 有(u,v) ∈ E, 则称U是G的一个完全子图.G的完全子图U是G的一个团当且仅当U不包含在G的更大的完全子图中,G的最大团是指G中所含顶点数最多的团.二.解题思路无向图G的最大团和最大独立集问题都可以用回溯法在O(n2^n)时间内解决.图G的最大团和最大独立集问题都可以看做图G的顶点集V的子集选取问题.因此,我们可以用子集树表示问题的解空间.解最大团问题的回溯法和解装载问题的回溯法十分相似.设当前扩展结点Z位于解空间树原创 2021-12-21 14:05:36 · 3179 阅读 · 0 评论 -
回溯算法 --- 例题5.0-1背包问题
一.问题描述略二.解题思路0-1背包问题是子集选取问题.一般情况下,0-1背包问题是NP完全问题.0-1背包问题的解空间用子集树来表示,解0-1背包问题的回溯法和解装载问题的回溯法十分相似.搜索解空间树时,只要其左儿子节点是一个可行节点,搜索就进入其左子树.当右子树中有可能包含最优解时(即上界大于当前最优价值,试想一下,若上界都不大于当前最优价值,那么在进入右子树就根本不可能找到更优解,何况上界还是一种理想状态下的最佳)才进入右子树搜索;否则将右子树剪去.设r是当前剩余物品价值总和,cp是当前价值原创 2021-12-21 14:04:55 · 853 阅读 · 0 评论 -
回溯算法 --- 例题4.N皇后问题
一.问题描述N*N棋盘上放置N个皇后使得每个皇后互不受攻击. 即任二皇后不能位于同行同列和同一斜线上.如四皇后问题的两个解:二.解题思路将棋盘从左至右,从上到下编号为1,…,n,皇后编号为1,…,n.设解为(x1, …, xn) , xi为皇后i的列号,且xi位于第i行.解空间:E={ (x1,…, xn) | xi∈Si, i=1,…,4}, Si={1, …, 4},1 <= i <= n解空间为排列树? 是的!N个皇后在N*N的棋盘中一共有C(N^2, N)种放置情况,我们原创 2021-12-21 14:04:07 · 720 阅读 · 0 评论 -
回溯算法 --- 例题3.符号三角形问题
一.问题描述下图是由14个“+”和14个“-”组成的符号三角形。2个同号下面都是“+”,2个异号下面都是“-”。在一般情况下,符号三角形的第一行有n个符号.目标是:符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同。 改为此: 二.解题思路解向量用n元组x[1:n]表示符号三角形的第一行,每个元素均可取0, 1两个值约束函数:当前符号三角形所包含的“+”个数与“-”个数均不超过 n(n+1)/4*一个例子:第1行是4个字符的符原创 2021-12-21 14:03:18 · 578 阅读 · 0 评论 -
回溯算法 --- 例题2.批处理作业调度问题
一.问题描述给定n个作业的集合J=(J1, J2, … , Jn)。每一作业Ji都有两项任务要分别在2台机器上完成. 每一作业须先由机器l处理, 再由机器2处理. 设tji是作业Ji在机器j上的处理时间, i=1,…,n, j=1, 2.Fji是作业Ji在机器j上完成处理的时间. 所有作业在机器2上完成时间和: f=∑F2i 称为该作业调度的完成时间和.对于给定的J, 要求制定一个最佳作业调度方案, 使完成时间和最小.二.解题思路批处理作业调度问题要从n个作业的所有排列中找出有最小完成时间和的作业原创 2021-12-21 14:02:13 · 1466 阅读 · 0 评论 -
回溯算法 --- 例题1.装载问题
一.问题描述n个集装箱装到2艘载重量分别为c1,c2的货轮,其中集装箱i的重量为wi且Σwi <= c1 + c2 , 1<=i<=n问题要求找到一个合理的装载方案可将这n个货箱装上这2艘轮船。例如 当n=3, c1=c2=50, w=[10, 40, 40], 可将货箱1和2装到第一艘船上;货箱3装到第二艘船上; 若w=[20, 40, 40], 则无法将全部货箱装船.二.解题思路简单分析可知:当Σwi = c1+c2, 1<=i<=n问题等价于子集和问题当原创 2021-12-21 14:00:33 · 2274 阅读 · 0 评论 -
回溯算法 --- 算法思想介绍
一.回溯算法的基本概念回溯法有“通用的解题法”之称。用它可以系统地搜索一个问题的所有解或任一解。回溯法是一个既带有系统性又带有跳跃性的搜索算法,它在问题的解空间树中,按深度优先策略,从根节点出发搜索解空间树。算法搜索至解空间树的任一结点时,先判断该结点是否包含问题的解。如果不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯。否则进入该子树,继续按深度优先策略搜索。回溯算法求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。回溯法求问题的一个解时,只要搜索到问题的一个解就可结束原创 2021-12-21 13:59:32 · 8163 阅读 · 0 评论 -
中国矿业大学2021年算法设计与分析实践考试题目以及题解(信安版)
B卷:1.求最大的数和最小的数题目描述:数学课上,老师给你一些列的数,让你编程求出最大的数和最小的数?输入:第一行是数的个数n,第二行是n个数,中间有空格间隔。输出:输出占一行,先是最小的数,然后是最大数,中间有一个空格。样例输入:411 22 55 999样例输出:11 999题解:水题代码:#include<bits/stdc++.h>using namespace std;int main(){ int n; cin>>原创 2021-12-21 13:47:28 · 664 阅读 · 0 评论 -
中国矿业大学2021年算法设计与分析实践考试题目以及题解(信安版)
说在前面:由于此次考试,不知道是哪位信安的大哥把学校的OJ平台给黑掉了,导致我们100来人同时登陆不上OJ,考试被迫终止半小时.但是由于少部分同学刚开始登录上去了一小会,看到了题目(比如我),所以为了公平起见,学校重新换了一套题.下面我把两套题以及相应题解放在下面,供大家学习参考!A卷:1.凯撒加密法题目描述:凯撒加密法,或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。原创 2021-12-21 13:45:03 · 1494 阅读 · 1 评论 -
贪心算法 --- 例题2.哈夫曼编码问题
贪心算法 — 例题2.哈夫曼编码问题一.问题描述Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。树的带权路径长度:树中所有叶子结点的带权路径长度之和,通常记作:WPL = Σwi*li (i=1~n)哈夫曼树,Huffman树定义:在权为w1,w2,…,wn的n个叶子结点的所有二叉树中,带权路径长度WPL最小的二叉树称为赫夫曼树或最优二叉树。本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。二.解题思路哈夫曼树的构造(哈夫曼原创 2021-11-28 11:00:00 · 1011 阅读 · 0 评论 -
贪心算法 --- 例题1.活动安排问题
贪心算法 — 例题1.活动安排问题一.问题描述n个活动的集合E={1,2,…,n},在某一时间内要独占使用某个资源。每个活动i使用资源的起始时间为Si,终止时间为Fi。活动i和活动j相容:是指[Si,Fi)与[Sj,Fj)不相交,即:Sj>=Fi 或Si>=Fj, 要求尽可能多地安排活动。即从活动集合E中选出最大相容活动子集。二.解题思路思路:最早结束的活动,优先安排。对f1,f2,…,fn从小到大排序 , 时间O(n log n);即将n个活动按照结束时间非降序排列,依次考虑活原创 2021-11-28 09:00:00 · 1082 阅读 · 0 评论 -
贪心算法 --- 算法思想介绍
贪心算法 — 算法思想介绍一.贪心算法的基本概念贪心算法也称为优先策略顾名思义是“择优录取”,在某些方面的应用是非常成功的,也是我们设计算法时经常使用的一种策略。国外叫做Greedy method,意即见到好的就抓住不放。它并不一定对所有问题都成功,但是对某些问题特别简单、有效。在贪婪算法中采用逐步构造最优解的方法。在每个阶段,都作出一个看上去最优的决策(在一定的标准下)。决策一旦作出,就不可再更改。作出贪婪决策的依据称为贪婪准则( criterion)。顾名思义,贪心算法只是做出在当前看来是最原创 2021-11-28 07:00:00 · 1851 阅读 · 0 评论 -
递归分治 --- 例题5.线性时间选择
递归分治 — 例题5. 线性时间选择一.问题描述给定线性序列集中的n个元素和正整数k, 1≤ k≤ n, 求第k小元素的位置.二.解题思路该篇文章中我们讨论与排序问题类似的元素选择问题,元素选择问题的一般提法是:给定线性序集合中n个元素和一个整数k(1 <= k <= n),要求找出这n个元素中第k小的元素,即如果将这n个元素依其线性排列数时,排在第k个位置的元素即为要找的元素.①最直观的解题方法:先排序,然后找到第k小的元素即可.这样时间复杂度至少是: O(n), 平均: O(n原创 2021-11-28 00:00:00 · 1020 阅读 · 0 评论 -
递归分治 --- 例题4. 快速排序
递归分治 — 例题4. 快速排序一.问题描述给定一个数组,使用快速排序算法进行排序.二.解题思路熟悉的快排,曾经写过不知道多少遍.在此还扩展了随机选择支点的算法RandomizedQuickSort.快排的思想很简单:对于输入a[p: r],按以下三个步骤进行排序:分解:取a中的一个元素为支点(pivot) 将a[p: r]划分成3段: a[p: q-1], a[q], a[q+1: r], 使得 a[p:q-1]中任一元素<=a[q], a[q+1: r]中任一元素 >=a[原创 2021-11-27 21:00:00 · 300 阅读 · 1 评论 -
递归分治 --- 例题3.合并排序
递归分治 — 例题3.合并排序一.问题描述将n个元素排成非递减顺序二.解题思路若n为1,算法终止;否则,将n个待排元素分割成k(k=2)个大致相等子集合A,B,对每一个子集合分别递归排序再将排好序的子集归并为一个集合合并排序算法可递归地描述如下:template<class Type>void MergeSort(Type a[], int left, int right){ if(left < right) //至少有两个元素 { int i = (left原创 2021-11-27 20:15:00 · 935 阅读 · 0 评论 -
递归分治 --- 例题2.棋盘覆盖
递归分治 — 例题2.棋盘覆盖一.问题描述在一个2^k x 2k个方格组成的棋盘中,恰有一方格残缺.残缺方格的位置有2(2k)种。故对任何k≥0,残缺棋盘有2^(2k)种.在棋盘覆盖问题中,要求用L型骨牌覆盖残缺棋盘上的所有方格且任何2个L型,骨牌不得重叠覆盖.2^k x 2k的棋盘覆盖中,用到的骨牌数为(4k -1)/3.二.解题思路使用分治算法,可以设计解棋盘覆盖问题的一个简捷算法.当k>0时,将2^k x 2k棋盘分割为**4个2(k-1) x 2^(k-1)子棋盘**, 残缺方原创 2021-11-27 20:00:00 · 584 阅读 · 0 评论 -
递归分治 --- 例题1.全排列
递归分治 — 例题1.全排列一.问题描述设计一个递归算法生成n个元素{r1, r2, … , rn}的全排列.此题与力扣主站第46题 — 全排列相同,以及力扣主站第47题 — 全排列Ⅱ二.解题思路设R={r1,r2…,rn}是要进行排列的n个元素,Ri=R-{ri}.集合X中的元素的全排列记为Perm(X).(ri)Perm(X)表示在全排列X的每个排列前加上前缀ri得到的排列.R的全排列可归纳定义为如下:当n==1时,Perm®=®,其中r是集合R中唯一的元素.当n > 1时,P原创 2021-11-27 19:45:00 · 890 阅读 · 0 评论 -
递归分治 --- 算法思想介绍
递归分治 — 算法思想介绍一.递归分治的基本概念递归的概念:直接或间接的调用自身的算法称为递归算法.用函数自身给出定义的函数成为递归函数.分治法的思想:将一个难以直接解决的大问题分割成一些规模较小的相同问题,以便各个击破,即分而治之.如果原问题可分割成k个子问题, 1<k<=n, 且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的.有分治法产生的子问题往往是原问题的较小模式,这为使用递归技术提供了方便.在这种情况下,反复利用分治手段,可以使子问题与原问题原创 2021-11-27 15:33:43 · 812 阅读 · 0 评论 -
动态规划---例题7.图像压缩
一.题目描述数字化图像是n*n的像素阵列. 假定每个像素有一个0~255的灰度值, 因此存储一个像素至多需8位.为了减少存储空间, 采用变长模式, 即不同像素用不同位数来存储, 步骤如下:图像线性化:将nn维图像转换为1n2向量 {p1,p2,…pn^2}分段: 将像素分成连续的m段s1,s2,…sm,使每段中的像素存储位数相同. 每个段是相邻像素的集合且每段最多含256个像素, 若相同位数的像素超过 256个的话, 则用两个以上段表示。创建三个表l: l[i]存放第i段长度, 表中各项均为8原创 2021-10-31 23:02:39 · 4949 阅读 · 1 评论 -
动态规划---例题6.多边形游戏
一.题目描述多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“*”。所有边依次用整数从1到n编号。游戏第1步,将一条边删除。随后n-1步按以下方式操作:(1)选择一条边E以及由E连接着的2个顶点V1和V2;(2)用一个新的顶点取代边E以及由E连接着的2个顶点V1和V2。将由顶点V1和V2的整数值通过边E上的运算得到的结果赋予新顶点。最后,所有边都被删除,游戏结束。游戏的得分就是所剩顶点上的整数值。问题:对于给定的多边形,原创 2021-11-02 09:00:00 · 2651 阅读 · 0 评论 -
动态规划---例题5.凸多边形最优三角剖分问题
一.题目描述通常,用多边形顶点的序列来表示一个凸多边形,即P=<v0 ,v1 ,… ,vn-1>表示具有n条边v0v1,v1v2,… ,vn-1vn的一个凸多边形,其中,约定v0 = vn 。若vi与vj是多边形上不相邻的两个顶点,则线段vivj称为多边形的一条弦。弦将多边形分割成凸的两个子多边形<vi ,vi+1 ,… ,vj>和<vj ,vj+1 ,… ,vi>。多边形的三角剖分是一个将多边形分割成互不重迭的三角形的弦的集合T。如上图为一个凸多边形的两个不同原创 2021-11-01 08:30:00 · 3654 阅读 · 0 评论 -
动态规划---例题4.最大子矩阵和问题
本题与力扣面试题 17.24. 最大子矩阵相同.一.问题描述给定一个正整数、负整数和 0 组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵。返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵,返回任意一个均可。二.解题思路如果有看过经典例题3 — 最大子段和,就会很快知道该问题的突破口.我们知道,最大子段和是针对一维数组而言,可以找到该数组中连续子数组之和最大的那一个.原创 2021-10-31 22:44:50 · 508 阅读 · 0 评论 -
动态规划---例题3.最大子段和问题
本题与力扣主站53题 — 最大子序和相同.一.问题描述给定n个整数(可能有负数)组成的序列a1,a2,…an, 求子段和ai+ai+1+…+aj的最大值。当所有整数均小于零时,定义其子段和为0。最大值为max{0, maxΣak}例:(-2, 11, -4, 13, -5, -2)的最大子段和为20二.解题思路1.朴素暴力我们使用数组a存放n个整数,sum、besti、bestj分别存放最大子段和及其始末下标。时间复杂度: T(n) = O(n^3)int MaxSum(int n, i原创 2021-10-31 22:38:43 · 1920 阅读 · 0 评论 -
动态规划---例题2.最长公共子序列问题
本题与力扣主站1143题相同.一.问题描述一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=<x1, x2,…, xm>,则另一序列Z=<z1, z2,…, zk>是X的子序列是指存在一个严格递增的下标序列 <i1, i2,…, ik>,使得对于所有j=1,2,…,k有例如,序列Z=<B,C,D,B>是序列X=<A,B,C,B,D,A,B>的子序列,相应的递增下标序列为<2, 3, 5, 7>。原创 2021-10-31 00:00:00 · 15396 阅读 · 2 评论 -
动态规划---例题1.矩阵连乘问题
一.问题描述矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数.若A是一个p×q的矩阵,B是一个q×r的矩阵,则其乘积C=AB是一个p×r的矩阵.其标准计算公式为:计算C=AB总共需要pqr次的数乘.给定n个矩阵{A1,A2,…,An}.其中Ai与Ai+1是可乘的,i=1,2,…,n-1.要求计算出这n个矩阵的连乘积A1A2…An.二.解题思路矩阵乘法满足结合律,故连乘积的计算可以有许多不同的计算次序.这种计算次序可以用加括号的方式来确定.若一个矩阵连乘积的计算次序已完全确定,也就是说该连乘积已原创 2021-10-29 00:00:00 · 5519 阅读 · 0 评论 -
动态规划 --- 算法思想介绍
一.动态规划的基本概念动态规划在五种算法设计方法中难度最大,它建立在最优原则的基础上.采用动态规划方法,可以高效地解决许多用贪婪算法或分治法无法解决的问题.动态规划(dynamic programming)属运筹学中的规划论分支,是求解决策过程最优化的数学方法.20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法——动原创 2021-10-28 10:40:03 · 4474 阅读 · 0 评论 -
尼姆博弈最详细解法
尼姆博弈:博主之所以要写这么一篇题解,是因为在算法课上做过的一道题.解题代码非常简单,但是博主愣是想了两天还没想明白其中的原理,直到今天才终于恍然大悟,特此记录下来分享给大家.看完了,想必你一定会懂!题目如下:题目描述Here is a simple game. In this game, there are several piles of matches and two players. The two player play in turn. In each turn, one can ch原创 2021-09-16 17:53:47 · 5285 阅读 · 0 评论