Algorithm
YDDUONG
这个作者很懒,什么都没留下…
展开
-
词典编码:LZ77算法(C/C++)
一、基本思想用指向早期曾经出现过的字符串的指针来表示当前被编码的字符串,如:二、LZ77算法算法伪码:示意图:举例:三、C\C++实现#include <iostream>#include <vector>#include <string>using namespace std;struct code { int off; i...原创 2019-05-04 09:21:50 · 3425 阅读 · 0 评论 -
算法导论 · 动态规划 · 二次项系数计算
算法说明递推公式如下C(n,k)=C(n-1,k-1)+C(n-1,k),n>k>0C(n,0)=C(n,n)=1源代码#include <cstdio>#include <cstring>#define maxn 100 + 1#define mincc(a, b) (a) > (b) ? (b) : (a)int c[maxn...原创 2019-07-26 23:14:31 · 1529 阅读 · 0 评论 -
算法导论 · 动态规划 · DAG最长路径
算法说明先对图进行拓扑排序,再从入度的节点开始计算dilg(v)=max(u,v)∈E{dilg(u)+w(u, v)}源代码#include <cstdio>#include <cstring>#include <vector>#include <queue>using namespace std;#define maxn ...原创 2019-07-26 23:16:37 · 2157 阅读 · 0 评论 -
算法导论 · 动态规划 · 比对
算法说明由小规模到大规模,每次都有三种情况,分别进行处理源代码#include <iostream>#include <cstdio>#include <cstring>#include <string>using namespace std;#define maxn 101#define minE(a, b) (a) >...原创 2019-07-26 23:19:21 · 298 阅读 · 0 评论 -
算法导论 · 动态规划 · 01背包问题
源代码#include <cstdio>#include <cstring> #include <vector>using namespace std;#define maxn 101#define maxm 1001#define maxK(a, b) (a) > (b) ? (a) : (b)struct node { int...原创 2019-07-26 23:22:32 · 250 阅读 · 0 评论 -
算法导论 · 动态规划 · 最优二分检索树
算法说明构造最佳二叉搜索树:如果已知集合元素的搜索概率,那么自然会提出一个关于最优二叉搜索树的问题,搜索中的平均比较数是可能的最小值。例如,考虑四个要搜索的键a、b、c和d,其概率分别为0.1、0.2、0.4和0.3。则0.11+0.22+0.43+0.34=2.9源代码运行结果...原创 2019-07-26 23:27:41 · 2157 阅读 · 0 评论 -
算法导论 · 动态规划 · 链式矩阵乘法
源代码#include <cstdio>#include <cstring>#define maxn 101#define minc(a, b) (a) > (b) ? (b) : (a)#define INF 1 << 29int c[maxn][maxn], m[maxn];int n;int main() { memset...原创 2019-07-26 23:30:13 · 353 阅读 · 0 评论 -
算法导论 · 贪心策略 · prim算法
算法说明普里姆算法,用来求加权连通图最小生成树,利用点到集合的距离,开始都是无穷大,随着点的加入,不断刷新距离,每次将距离最小的点加入,同时也判断是不是已经在集合中了。源代码#include <cstdio>#include <vector>#include <algorithm>using namespace std;#define max...原创 2019-07-27 22:31:11 · 1342 阅读 · 0 评论 -
算法导论 · 贪心策略 · kruskal算法
算法说明克鲁斯卡尔算法,利用边贪心,先对边排序,每次加入最小的边,使用并查集,判断边的端点是否已经在同一个集合中即确定要不要加入这条边源代码#include <cstdio>#include <vector>#include <algorithm>using namespace std;#define maxn 1000 + 1struc...原创 2019-07-27 22:33:11 · 1423 阅读 · 0 评论 -
算法导论 · 贪心策略 · dijkstra算法
算法说明迪杰斯特拉算法是要来求单源路径最短算法,与普里姆算法很相近,唯一的区别,这里刷新的是源点与其他点的距离源代码#include <cstdio>#include <vector>#include <algorithm>using namespace std;#define maxn 1000 + 1#define inf 1 <...原创 2019-07-27 22:35:40 · 916 阅读 · 0 评论 -
算法导论 · 回溯算法 · n皇后问题
源代码#include <cstdio> #include <cmath> #include <algorithm>using namespace std;const int n = 8;int x[n + 1], num = 0; //皇后的位置用列值来表示,下标为行数,值为列 bool isPlace(int k) { for(int...原创 2019-07-27 22:38:17 · 604 阅读 · 0 评论 -
算法导论 · 回溯算法 · 子集和数问题
算法说明求解201内,任意多个质数和为201的解的个数,构造向量解的过程源代码#include <iostream>#include <cstring>#include <cmath>using namespace std;#define maxn 10000#define M 201int prime[maxn], isPri[maxn...原创 2019-07-27 22:40:53 · 1299 阅读 · 0 评论 -
算法导论 · 回溯算法 · 图着色问题
源代码#include <cstdio>#include <algorithm>using namespace std;const int maxn = 100;int n, edge, m = 4;int g[maxn][maxn];int x[maxn];void MColoring(int k) // x[1]=1, 其它分量初值为0{...原创 2019-07-27 22:43:05 · 1838 阅读 · 0 评论 -
算法导论 · 分支界限 · 旅行商问题
源代码#include<iostream> #include<algorithm> #include<cstdio> #include<queue> #define INF 100000 using namespace std; int n; int mp[100][100]; struct node { ...原创 2019-07-27 22:46:16 · 892 阅读 · 0 评论 -
算法导论 · 动态规划 · Floyd所有点对之间最短距离
算法说明Floyd主要来刷新两点之间的距离,三重循环源代码#include <cstdio>#include <algorithm>using namespace std;#define INF 1 << 20#define maxn 100 + 1int n, m, a, b, c;int G[maxn][maxn];void ou...原创 2019-07-26 23:11:32 · 484 阅读 · 0 评论 -
算法导论 · 动态规划 · 多段图问题
算法说明计算开始点到结束点的最短路径长度,从后往前记录最短路径长COST(4,9) = 4,COST(4, 10) = 2,COST(4,11) = 5COST(3,6) = min{6 + COST(4,9),5 + COST(4,10)} = 7COST(3,7) = min{4 + COST(4,9),3 + COST(4,10)} = 5COST(3,8) = 7COST(...原创 2019-07-26 23:06:59 · 981 阅读 · 0 评论 -
Algorithm:矩阵中“块”的个数
问题描述:给一个m * n的01矩阵,如果矩阵中若干个1是相邻的,那么称这些1是一个相邻的“块”。求给定矩阵中块的个数输入样例(8 * 7的01矩阵):0 1 1 1 0 0 10 0 1 0 0 0 00 0 0 0 1 0 00 0 0 1 1 1 01 1 1 0 1 0 01 1 1 1 0 0 00 0 0 0 1 0 11 0 1 1 0 1 0该矩阵中“块”的...原创 2019-04-30 20:08:59 · 952 阅读 · 1 评论 -
算法导论 · 蛮力法 · 任务分配问题
算法说明对于任务分配问题,n个人n项任务,代价不同,蛮力法排列组合求解源代码#include <cstdio>#include <algorithm>using namespace std;#define n 4#define max(a, b) (a) > (b) ? (a) : (b)struct it { int w, v;}; ...原创 2019-07-11 20:54:27 · 3159 阅读 · 0 评论 -
算法导论 · 蛮力法 · 旅行商问题
算法说明旅行商问题是NP难问题,这里给出蛮力法求解过程,从原始城市出发,经过每一个城市后,再回到原始城市,即对中间的城市进行排列组合,求出每一种情况的权值和,取最小值。这里的排列组合,用stl中next_permutation()实现代码如下:#include <cstdio>#include <algorithm>using namespace std;...原创 2019-07-11 20:51:08 · 2294 阅读 · 0 评论 -
算法导论 · 蛮力法 · 背包问题
算法说明蛮力法求解背包问题,求解出只放[1…n]件物品时的最大价值,对于每种放不同个数的物品,用排列组合来确定放那几个物品,总之构造向量解。源代码#include <cstdio>#include <algorithm>using namespace std;#define n 4#define max(a, b) (a) > (b) ? (a) ...原创 2019-07-11 20:58:51 · 1435 阅读 · 0 评论 -
算法导论 · 分治法 · 归并排序
算法说明归并排序粗暴的将待排数据分成两块,分别排序,对每一部分在分成两部分,直到分成一个数再直接返回,最后逐级合并。源代码#include <cstdio>void Merge(int p1[],int q1, int p2[], int q2, int a[]) { //合并 int i = 0, j = 0, k = 0; while(i < q1 &am...原创 2019-07-26 22:15:46 · 178 阅读 · 0 评论 -
算法导论 · 分治法 · 快速排序
算法说明将首元素作为一个Key,从两边往中间遍历,用这个key,分成比它大和比它小的两部分,递归下去源代码#include <cstdio>int a[10] = {1, 4, 5, 7, 8, 9, 0, 3, 2, 6}, n = 10; //待排数组int partition(int arr[], int p, int q) { int i = p, j = q...原创 2019-07-26 22:19:53 · 150 阅读 · 0 评论 -
算法导论 · 分治法 · 大整数乘法
算法说明对于大整数乘法,是将一个数,在数位上直接分成两半,分开计算,按照公式,加法直接计算,遇到乘法时,递归调用自己。公式如下图:源代码#include <cstdio>#include <cmath>int multiplye(int a, int b, int n) { //大整数乘法 if(n == 1) return a * b; int m...原创 2019-07-26 22:27:40 · 825 阅读 · 0 评论 -
算法导论 · 分治法 · strassen矩阵乘法
算法说明strassen矩阵乘法是将每个矩阵分成4块,分别按照公式计算,其中再遇到矩阵乘法时,递归调用。公式如下:源代码#include <cstdio>const int n = 2;void strassen(int **a, int **b, int **c, int m) { if(m == 1) { c[0][0] = a[0][0] * b[0][...原创 2019-07-26 22:35:11 · 1470 阅读 · 0 评论 -
算法导论 · 分治法 · 最近点对问题
算法说明先将坐标系中的点按横坐标的大小进行排序,从中位数大小位置开始分割,独立的求两边的最短距离,去最小值,之后以这个中位线处往两边扩展最小值个长度,求改范围的最小值,比较三者,得出问题的最小值。对于求两边的最小值问题,递归调用。源代码#include <iostream>#include <cmath>#include <ctime>#incl...原创 2019-07-26 22:38:23 · 1210 阅读 · 2 评论 -
算法导论 · 分治法 · 第K小的数
算法说明对于不同的数据规模选择不同的算法,对于大规模,先进行分组,如5个一组,找出每组的中位数形成一组数据,对于遮住数据,再找其中位数,利用这个中位数就可将这个数据规模分成两部分,最看要找的数在那一部分中,递归调用。源代码#include <iostream>#include <vector>#include <algorithm>using n...原创 2019-07-26 22:42:26 · 1840 阅读 · 0 评论 -
算法导论 · 分治法 · 循环赛日程表安排
算法说明这个算法主要是找规律,对角线块的排列是一样的,直接进行块复制源代码#include <iostream> using namespace std;#define max 10000int b[max][max];void copy(int n);void tournament(int n);int main() { //freopen("Cloe...原创 2019-07-26 22:49:57 · 367 阅读 · 0 评论 -
算法导论 · 减治法 · 迷宫问题
算法说明迷宫问题可以用深度或者是广度搜索来实现走出迷宫,这里使用dfs,同时找出所有可能的路线。源代码#include <cstdio>#include <vector>#include <cstring>using namespace std;struct node { int x, y; node(int xx, int yy) {...原创 2019-07-26 22:53:56 · 286 阅读 · 0 评论 -
算法导论 · 减治法 · 递归实现插入排序
源代码#include <cstdio>void inserSort(int a[], int n) { int key = a[n], i; for(i = n - 1; i >= 0; i--) { if(a[i] > key) a[i + 1] = a[i]; else break; } a[i + 1] = key;}void in...原创 2019-07-26 22:57:08 · 464 阅读 · 0 评论 -
算法导论 · 分支界限 · 01背包问题
源代码#include <cstdio>#include <cstdlib> typedef struct QNode{ int value; //当前结点的总价值 int weight; //当前的总重量 struct QNode *next;}QNode, *QueuePtr; typedef struct{ QueuePtr front; ...原创 2019-07-27 22:48:33 · 863 阅读 · 0 评论