![](https://img-blog.csdnimg.cn/20190914194259587.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法
文章平均质量分 73
算法分析与设计
顾道长生'
时人不识凌云木,直待凌云始道高。
展开
-
深度理解:蓝白红旗问题
算法思想:顺序扫描线性表,将蓝色旗交换到线性表的最前面,红色旗交换到线性表的最后面。为此,设立三个指针,其中j为工作指针,表示当前扫描的元素,i以前的元素全为蓝色,k以后的元素全为红色,根据j所指元素的颜色,决定将其交换到序列的前部或尾部。初始时,i=0,k=n-1。notes:1)若遍历到的位置为BLUE,则说明它一定属于前部,于是就和i位置进行交换,然后j向前进,i也向前进(表示前边的已经都排好了)。2)若遍历到的位置为WHITE,则说明它一定属于中部,根据总思路,中部的我们都不动,然后j向前.原创 2020-10-23 16:13:07 · 691 阅读 · 0 评论 -
购票问题(回溯法)
#include<bits/stdc++.h>using namespace std;double a[100];int n,tot;void Print(){ int i=1; tot++; for(i=1;i<=2*n;i++) { if(i>1) { printf(","); } cout<<a[i]; } cout<<endl;}void find(int t,int sum1,int sum2){//.原创 2020-10-22 18:43:59 · 1052 阅读 · 6 评论 -
计数排序
代码实现://计数排序 #include<bits/stdc++.h>using namespace std;int main(){ int n; cin>>n; int a[n],b[n],c[n]; for(int i=0; i<n; i++) cin>>a[i]; for(int i=0; i<n; i++) c[i]=0; for(int i=0; i<n-1; i++) { for(int j=i+1; j.原创 2020-08-02 18:58:20 · 116 阅读 · 0 评论 -
算法:批处理作业调度(回溯)
1、问题描述每一个作业Ji都有两项任务分别在2台机器上完成。每个作业必须先有机器1处理,然后再由机器2处理。作业Ji需要机器j的处理时间为tji。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理时间。则所有作业在机器2上完成处理时间和f=F2i,称为该作业调度的完成时间和2、简单描述对于给定的n个作业,指定最佳作业调度方案,使其完成时间和达到最小。区别于流水线调度问题:批处理作业...原创 2019-12-16 11:09:27 · 2095 阅读 · 0 评论 -
算法:回溯算法之装载问题
问题描述:有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且,装载问题要求确定是否有一个合理的装载方案可将这些集装箱装上这2艘轮船。如果有,找出一种装载方案。 例如:当n=3,c1=c2=50,且w=[10,40,40]时,则可以将集装箱1和2装到第一艘轮船上,而将集装箱3装到第二艘轮船上;如果w=[20,40,40],则无法将这3个集装箱都装上轮船。基本...原创 2019-12-09 15:54:29 · 4901 阅读 · 0 评论 -
算法:(选做)独立任务最优调度问题
用两台处理机A和B处理n个作业。设第i个作业交给A处理需要时间ai,交给B处理需要时间bi。由于各作业的特点和机器的性能关系,ai和bi之间没有明确的大小关系。既不能将一个作业分开由2台机器处理,也没有一台机器能同时处理2个作业。设计一个动态规划算法,使得这两台机器处理完这n个作业的时间最短。测试用例:6(任务数目)2 5 7 10 5 2(机器A处理这些任务的时间)3 8 4 11 3 ...原创 2019-11-11 16:01:39 · 2174 阅读 · 0 评论 -
算法:最优二叉搜索树
1、问题描速: 设 S={x1, x2, ···, xn} 是一个有序集合,且x1, x2, ···, xn表示有序集合的二叉搜索树利用二叉树的顶点存储有序集中的元素,而且具有性质:存储于每个顶点中的元素x 大于其左子树中任一个顶点中存储的元素,小于其右子树中任意顶点中存储的元素。二叉树中的叶顶点是形如(xi, xi+1) 的开区间。在表示S的二叉搜索树中搜索一个元素x,返回的结果有两种情形:...原创 2019-11-11 11:05:04 · 4282 阅读 · 0 评论 -
算法:0-1背包(跳跃点解法)
由m(i,j)的递归式容易证明,在一般情况下,对每一个确定的i(1≤i≤n),函数m(i,j)是关于变量j的阶梯状单调不减函数。跳跃点是这一类函数的描述特征。在一般情况下,函数m(i,j)由其全部跳跃点唯一确定。如图所示。对每一个确定的i(1≤i≤n),用一个表p[i]存储函数m(i,j)的全部跳跃点。表p[i]可依计算m(i,j)的递归式递归地由表p[i+1]计算,初始时p[n+1]={(0...原创 2019-11-10 08:54:11 · 6917 阅读 · 3 评论 -
算法:0-1背包问题
看b站一个人讲的,虽然讲的不好,但是课件做的还是挺不错的,拿来借鉴一下(2333)原创 2019-11-05 20:17:06 · 417 阅读 · 1 评论 -
算法:流水作业调度
问题:n个作业 N={1,2,…,n}要在2台机器M1和M2组成的流水线上完成加工。每个作业须先在M1上加工,然后在M2上加工。M1和M2加工作业 i 所需的时间分别为 ai 和bi,每台机器同一时间最多只能执行一个作业。流水作业调度问题要求确定这n个作业的最优加工顺序,使得所有作业在两台机器上都加工完成所需最少时间。最优调度应该是:使M1上的加工是无间断的。即M1上的加工时间是所有ai...原创 2019-11-01 12:48:37 · 7691 阅读 · 5 评论 -
算法:数字三角形
题目重述描述73 88 1 02 7 4 44 5 2 6 5(图1)图1给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的那个数或者右边的那个数。输入输入的是一行是一个整数N (1 < N <= 100),给出三角形...原创 2019-10-31 20:38:21 · 872 阅读 · 0 评论 -
算法:多边形游戏
1、问题描述: 给定N个顶点的多边形,每个顶点标有一个整数,每条边上标有+(加)或是×(乘)号,并且N条边按照顺时针依次编号为1~N。下图给出了一个N=4个顶点的多边形。游戏规则 :(1) 首先,移走一条边。 (2) 然后进行下面的操作: 选中一条边E,该边有两个相邻的顶点,不妨称为V1和V2。对V1和V2顶点所标的整数按照E上所标运算符号(+或是×)进行运算,得到一个整数;用该整数标...原创 2019-10-31 20:24:42 · 1891 阅读 · 6 评论 -
算法:凸多边形最优三角剖分
1、问题相关定义: (1)凸多边形的三角剖分:将凸多边形分割成互不相交的三角形的弦的集合T。(2)最优剖分:给定凸多边形P,以及定义在由多边形的边和弦组成的三角形上的权函数w。要求确定该凸多边形的三角剖分,使得该三角剖分中诸三角形上权之和为最小。 凸多边形三角剖分如下图所示: 2、最优子结构性质: 若凸(n+1)边形P={V0,V1……Vn}的最优三角剖分T包含三角形...原创 2019-10-31 18:21:17 · 10431 阅读 · 3 评论 -
算法:最长公共子序列(输出所有最长公共子序列)
问题描述:给定两个序列,例如 X = “ABCBDAB”、Y = “BDCABA”,求它们的最长公共子序列的长度。下面是求解时的动态规划表,可以看出 X 和 Y 的最长公共子序列的长度为4:输出一个最长公共子序列并不难(网上很多相关代码),难点在于输出所有的最长公共子序列,因为 LCS 通常不唯一。我们需要在动态规划表上进行回溯 —— 从c[m][n],即右下角的格子,开始进行判断:如...原创 2019-10-28 15:11:57 · 23602 阅读 · 9 评论 -
算法:马的Hamilton周游路线问题
在国际象棋中马是走日字的,如果是一般情况马一共有八种走法(如下图): 所以我在这边用2个一位数组来表示其8种走法 //考虑到马有8种走法 int dx[8]={-2,-1,1,2,-2,-1,2,1}; int dy[8]={-1,-2,-2,-1,1,2,1,2}; 之后就让马根据这八种走法来走不过还要考虑下面3种情况 第一种情况 ...原创 2019-10-18 20:36:59 · 2724 阅读 · 0 评论 -
算法:动态规划入门之矩阵连乘
首先让我们复习一下矩阵连乘的有关知识。对于矩阵知识很了解的人可以跳过矩阵知识这块内容,不过笔者建议最好复习一下:矩阵的乘法:矩阵相乘只有在第一个矩阵的列数和第二个矩阵的行数相同時才有定义。假如A为m×n矩阵,B为n×p矩阵,则他們的乘AB(有时记做A·B)会是一个m×p矩阵。例如一个2x3的矩阵与一个3x2的矩阵的乘会是一个2x2的矩阵 。例子:矩阵连乘:设有矩阵M1,M2,M3,...原创 2019-10-11 13:24:06 · 1007 阅读 · 0 评论 -
算法:全排列递归(去重版)
核心:去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。用编程的话描述就是第i个数与第j个数交换时,要求[i,j)中没有与第j个数相等的数。#include<bits/stdc++.h>using namespace std;void swap(int &x,int &y){ int t; t = x; x = y; y = t...原创 2019-09-09 16:58:31 · 412 阅读 · 0 评论 -
算法:全排列递归解法
问题:有一组数R,需要输出它的全排列。R的递归可定义如下:当个数n为1时,Perm® = ®,其中r是集合R中唯一的元素当个数n大于1时,Perm®由(r1)Perm(R1),(r2)Perm(R2),(r3)Perm(R3),…,(rn)Perm(Rn)构成其中Ri = R - {ri} 即该集合中减去对应元素思路其实说直白点,就是递归地把这组数规模一个一个地缩小,如1,2,3,4. ...原创 2019-09-05 08:50:58 · 216 阅读 · 0 评论 -
算法:台阶问题:递归解决
0)注意:0级台阶有0种方法,如果n>1,f(0)=1;1)这里的f(n) 代表的是n个台阶有一次1,2,…n阶的 跳法数。2)n = 1时,只有1种跳法,f(1) = 13) n = 2时,会有两个跳得方式,一次1阶或者2阶,这回归到了问题(1) ,f(2) = f(2-1) + f(2-2)4) n = 3时,会有三种跳得方式,1阶、2阶、3阶,那么就是第一次跳出1阶后面剩下...原创 2019-09-05 08:47:10 · 2216 阅读 · 0 评论 -
算法:四柱汉诺塔
四塔问题:设有A,B,C,D四个柱子(有时称塔),在A柱上有由小到大堆放的n个盘子,如图所示。今将A柱上的盘子移动到D柱上去。可以利用B,C柱作为工作栈用,移动的规则如下:①每次只能移动一个盘子。②在移动的过程中,小盘子只能放到大盘子的上面。设计并实现一个求解四塔问题的动态规划算法,并分析时间和空间复杂性。算法思想:用如下算法移动盘子(记为FourPegsHanoi):1)、将A柱上...原创 2019-09-02 17:23:40 · 8783 阅读 · 1 评论 -
算法:半数集问题
问题描述给定一个自然数n,由n开始可以依次产生半数集set(n)中的数如下: (1)set(n)中包含n; (2)在n的左边加上一个自然数,但该自然数不能超过最近添加的数的一半; (3)按此规则进行处理,直至不能添加自然数为止。 例如,set(6)={6,16,26,126,36,136}。 注意:该半数集是多重集。编程任务:对于给定的自然数n,编程计算半数集set(n)中元素的个...原创 2019-09-11 10:23:49 · 1551 阅读 · 0 评论 -
算法:二分法求a^n
#include <bits/stdc++.h>using namespace std;int BinaryPow(int a,int n){ if(n==1) return a; else { int r; int m = n/2; r = BinaryPow(a,m); if(n%2==0) return r*r; else ret...原创 2019-09-12 15:18:34 · 2472 阅读 · 2 评论 -
算法:整数因子分解问题
h(n)为n的划分数h(1) = 1h(2) = 1h(n) = h(n/2) + h(n/3) + ... + h(n/n) 前提是能被整除整数因子分解问题Time Limit: 1000 ms Memory Limit: 65536 KiBProblem Description大于1的正整数n可以分解为:n=x1x2…xm。例如,当n=12 时,共有8 种不同的分解式:1...原创 2019-09-12 15:30:22 · 2119 阅读 · 0 评论 -
算法:排列的字典序问题
排列的字典序问题Time Limit: 1000 ms Memory Limit: 65536 KiBSubmit StatisticProblem Descriptionn个元素{1,2,……, n }有n!个不同的排列。将这n!个排列按字典序排列,并编号为0,1,…,n!-1。每个排列的编号为其字典序值。例如,当n=3时,6 个不同排列的字典序值如下:给定n以及n个元素{1,2,…...原创 2019-09-14 20:23:49 · 7385 阅读 · 2 评论 -
算法:归并排序
图示过程(1) 归并排序的流程(2) 合并两个有序数组的流程C++代码实现:#include <bits/stdc++.h>using namespace std;void merge(int *a, int left, int mid, int right, int *temp){ int i = left; int j = mid + 1; int t...原创 2019-09-16 16:24:35 · 131 阅读 · 0 评论 -
算法:快速排序
引用百度百科的快排原理原理设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选快排图快排图用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。 [1] 一趟快速排序的算法是: [1] 1)设置两...原创 2019-09-16 16:33:29 · 415 阅读 · 0 评论 -
算法:线性时间选择
定义:给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素。(1)在某些特殊情况下,很容易设计出解选择问题的线性时间算法。如:当要选择最大元素或最小元素时,显然可以在O(n)时间完成。(一趟比较即可)(2)一般的选择问题,特别是中位数的选择问题似乎比最小(大)元素要难。但实际上,从渐近阶的意义上,它们是一样的。也可以在O(n)时间完成。步骤:(1)将n个输入元...原创 2019-09-18 22:45:22 · 36298 阅读 · 12 评论 -
算法:棋盘覆盖问题
如何应用分治法求解棋盘覆盖问题呢?分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分解为规模较小的棋盘覆盖问题。k>0时,可将2k×2k的棋盘划分为4个2(k-1)×2(k-1)的子棋盘,如图4.11(a)所示。这样划分后,由于原棋盘只有一个特殊方格,所以,这4个子棋盘中只有一个子棋盘包含该特殊方格,其余3个子棋盘中没有特殊方格。为了将这...原创 2019-10-09 20:06:59 · 4499 阅读 · 1 评论 -
算法:循环赛日程表_一般化(n可以为奇数,也可以为偶数)
算法思路:2. 算法思路(N可能为奇数,也可能是偶数)总体思路:按分治策略,将所有分为两半,n个选手可以通过n/2个选手设计的比赛日程表来决定。递归地用一分为二的略对选手进行分割,直到只剩下两个选手。对于N为奇数的情况可以虚拟多一个选手,使其编程N+1个选手的日程表,最然后忽略虚拟运动员参与的比赛。对于分割时候N/2的情况也做特殊处理, 前n/2轮比赛空选手与下一个未参赛的选手进...原创 2019-10-10 09:58:09 · 2948 阅读 · 1 评论 -
算法:二分搜索算法(递归)
二分算法步骤描述前提:有序数组中查找关键词所在的位置① 首先确定整个查找区间的中间位置 mid = strat+(end-strat)/2② 用待查关键字key值与中间位置的关键字值进行比较;若相等,则查找成功若大于,则在后(右)半个区域继续进行折半查找若小于,则在前(左)半个区域继续进行折半查找③ 对确定的缩小区域再按折半公式,重复上述步骤#include<...原创 2019-09-09 16:53:33 · 4129 阅读 · 0 评论