自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 快速幂

int quickpow(int x,int y) { int n=1; while(y!=0) { if (y&1) n*=x; x=x*x; y=y>>1; } return n; }

2021-02-03 23:41:22 58

原创 背包

01背包 int w[maxn]物品的重量 int v[maxn]物品的价值 int dp[maxn][maxn] int c背包容量n物品数 for(int i=1;i<=n;++i) { for(int j=1;j<=c;++j) { if(j<w[i]) { d[i][j]=dp[i-1][j]; } else { dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]; } } } 完全背包 for(int i=1;i<=n;++i) { f

2021-02-03 23:38:42 140

原创 最小生成树

1.Kruskal算法 此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。 把图中的所有边按代价从小到大排序; 把图中的n个顶点看成独立的n棵树组成的森林; 按权值从小到大选择边,所选的边连接的两个顶点ui,viui,vi,应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。 重复(3),直到所有顶点都在一颗树内或者有n-1条边为止。 2.Prim算法 此算法可以称为“加点法”,每次迭代选择代价最小的边对应的点,

2021-02-01 00:06:39 208

原创 最短路

dijkstra void dijkstra(int s) { memset(d,inf,sizeof d); memset(vis,0,sizeof vis); d[s]=0; for(int i=1;i<=n;i++) { int x=0; for(int j=1;j<=n;j++) { if(!vis[j]&&(x==0&&d[j]<d[x]))x=j; } vis[x]=1; for(int i=1;i<

2021-01-31 00:05:50 48

原创 哈希

哈希加快查找的原理 将字符串的key,转成整数,使用整数找到对应的value Hash算法将字符串转成整数,同样的Hash值得 key:value会放到一个集合里面,由于Hash能使得不同的字符串尽量有不同的整数值 将海量的数据,按照HASH值分成不同的集合,先找集合,再找key–>value,大大提高效率 或者说 通过获得你要排序的序列长度(m), 然后得出比这个 m 大的素数作为数组的长度(n), 然后对接下来的输入数据(D)进行取模运算(v=D%n), 然后取模之后的数据存到数组中。 字符串哈希

2021-01-30 00:27:44 121

原创 动态规划(DP)

基本思想:将原问题分解为相似的子问题,在求解 的过程中通过子问题的解求出原问题的解 只能应用于有最优子结构的问题(即局部最优解能 决定全局最优解,或问题能分解成子问题来求解)。 计算机科学与工程、管理科学(运筹学)等领域中 许多算法的基础,如最短路径、背包问题、项目管 理、网络流优化等。 类型 串和序列的DP问题 区间DP 背包DP 树形DP 状态压缩DP 数位DP 概率/期望DP 博弈型DP ...

2021-01-27 23:49:06 74

原创 2021-01-26

贪心算法一般按如下步骤进行 ①建立数学模型来描述问题。 ②把求解的问题分成若干个子问题。 ③对每个子问题求解,得到子问题的局部最优解。 ④把子问题的解局部最优解合成原来解问题的一个解。 简而言之就是找最优解法。 ...

2021-01-26 23:46:21 55

原创 线段树

inline void build(int i,int l,int r){//递归建树 tree[i].l=l;tree[i].r=r; if(lr){//如果这个节点是叶子节点 tree[i].sum=input[l]; return ; } int mid=(l+r)>>1; build(i2,l,mid);//分别构造左子树和右子树 build(i2+1,mid+1,r); tree[i].sum=tree[i2].sum+tree[i2+1].sum;//刚才我们发现的性质return

2021-01-25 23:37:31 43

原创 BFS

广度优先搜索算法的搜索步骤一般是: (1)从队列头取出一个结点,检查它按照扩展规则是否能够扩展,如果能则产生一个新结点。 (2)检查新生成的结点,看它是否已在队列中存在,如果新结点已经在队列中出现过,就放弃这个结点,然后回到第(1)步。否则,如果新结点未曾在队列中出现过,则将它加入到队列尾。 (3)检查新结点是否目标结点。如果新结点是目标结点,则搜索成功,程序结束;若新结点不是目标结点,则回到第(1)步,再从队列头取出结点进行扩展。 广度优先搜索算法的框架一般如下: void BFS() { 队列初始化;

2021-01-24 08:15:22 91

原创 并查集

并查集 并查集的三个基本操作 初始化:初始的时候每个结点各自为一个集合,father[i]表示结点 i 的父亲结点,如果 father[i]=i,我们认为这个结点是当前集合根结点。 void init() { for (int i = 1; i <= n; ++i) { father[i] = i; } } 2) 查找:查找结点所在集合的根结点,结点 x 的根结点必然也是其父亲结点的根结点。 int get(int x) { if (father[x] == x) { // x 结点就是根结点 r

2021-01-22 23:52:57 65

原创 二分法

并查集 int par[MAX_N];//父亲 int rank[MAX_N];//树的高度 //初始化n个元素 void init(int n) { for (int i = 0; i < n; ++i) { par[i]=i; rank[i]=0; } } //查询树的根 int find(int x) { if(par[x]==x) { return x; } else return par[x]=find(par[x]); } //合并x和y所属的集合 void unite(int x,in

2021-01-21 23:47:01 72

原创 好记起来背起来嘞

常用的数据结构: 数组(array) , 链表(list), 树(tree), 栈(stack), 队列(queue), 集合(set), 映射表(map) 用string构造函数 用法与int,float,char,double等相似 常用查找 str.find(s, pos); //查找字符串s在str中第一次出现位置,从pos开始查找 str.find(s, pos,n); //在str中从pos位置查找字符串s的前n个字符第一次位置 str.find(c,pos = 0); //查找字符c第一

2021-01-21 00:42:40 92

空空如也

空空如也

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

TA关注的人

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