自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 acm总结——IDA*

原理IDA*算法是基于迭代加深的A*算法,同时运用了迭代加深和全局最优性剪枝迭代加深只有在状态呈指数级增长时才有较好的效果。例题P1379 八数码难题题目描述在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。输入格式输入初始状态,一行九个

2022-04-14 14:12:39 143

原创 acm总结——多源BFS

原理一般情况下,我们使用的是单源BFS来处理只有一个起点的情况,对于有多个起点,便是用多源BFS,仅需将多个起点提前塞进队列就行例题P1332 血色先锋队题目背景巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物。孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围,现在他们将主力只好聚集了起来,以抵抗天灾军团的围剿。可怕的是,他们之中有人感染上了亡灵瘟疫,如果不设法阻止瘟疫的扩散,很快就会遭到灭顶之灾。大领主阿比迪斯已经

2022-04-11 18:52:26 427

原创 acm总结——埃氏筛

时间复杂度:O(nloglogn)利用以筛出来的素数,优先筛掉后面可能会出现的合数#include<iostream>#include<algorithm>using namespace std;const int N = 1000010;int primes[N], cnt;bool st[N];void get_primes(int n){ for (int i = 2; i <= n;i++){ if(!st[i])

2022-04-07 18:49:00 98

原创 acm总结——拓扑排序

原理拓扑排序是用来解决DAT(有向无环图)的问题,对于出的序列并不一定是唯一的。常会被用来解决做存在依赖关系的问题,例如“要做A任务时必须先完成B任务”。其时间复杂度为O(n + m)(n为点的个数,m为边的条数)代码思路使用vector来存储图,用一个ind数组代表该点的入度,out数组代表该点的出度,对于一个序列,我们首先遍历每个点,每个入度为0的点塞入队列,用bfs遍历下去,遍历过程中,每遍历一个点便让ind减一,当ind减为0时再塞入队列中。对于最后结果,这个序列的尾就为出度为0的点。

2022-03-29 17:27:41 142

原创 acm总结——图论基础

图的类型1.有向图 2.无向图 3.加权图图的实现邻接矩阵邻接矩阵a[i][j] 代表一个矩阵,其中的i,j代表两条边,其能够实现O(1)的搜索和更新,但其空间复杂度却在O(n ^ 2)代码实现:略邻接表代码实现:#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int e[N], ne[N], h[N], w[N];int idx;void add(int a,int

2022-03-29 15:14:27 349

原创 acm总结——三分法

何时使用二分法使用的前提为一个有序的序列,可以看成只能用作单调函数,但当我们需要处理既有递增又有递减的函数,我们就可以使用三分法。原理对于二分法我们每次取一个mid,而对于三分法我们每次取一个mid1和mid2,这两个mid由mid -eps和mid +eps得到。我们要求一个极小值点的x,对于一个先递减再递增的区间,当mid1和mid2为F(mid - eps) > F(mid + eps)的时候,说明他在极值点的左边,所以缩小区间让l = mid,反之相同代码实现#inc..

2022-03-28 15:08:44 667

原创 acm总结——折半搜索

原理折半搜索是将整个搜索过程一分为二,分别进行搜索,最后再将两个序列合并,他的时间复杂度为O(2^(n / 2) + 合并过程的时间复杂度)实现合并过程中,若序列为有序经常想到使用二分查找。例题洛谷的[CEOI2015 Day2]世界冰球锦标赛题目描述译自CEOI2015Day2 T1「Ice Hockey World Championship」今年的世界冰球锦标赛在捷克举行。Bobek 已经抵达布拉格,他不是任何团队的粉丝,也没有时间观念。他只是单纯的想去看几场比..

2022-03-24 19:57:28 128

原创 acm总结——ST表

原理ST表基于倍增的思想,主要用来处理RMQ问题(区间最大或最小值问题),可以实现O(nlogn)的时间复杂度,O(1)的查询时间。预处理思想我们可以利用动态规划的方法预处理。我们使用dp(i , j)来表示区间[i , i + 2^j - 1]中的最值,对于预处理步骤中,我们还应该先预处理[i , i + 2^0 - 1]这个区间的最值,也就是[i, i]区间,所以很容易可以得到dp[i, 0] = a[i]。根据倍增的思想,我们可以状态转移方程为dp[i, j] = max(dp[i][

2022-03-23 20:37:42 653

原创 acm总结——链表

原理数组是一种支持随机访问,但不支持任意位置插入或者删除元素的数据结构,而链表可以在任意位置插入或者删除元素,但只能按顺序访问元素。链表一共分为三种:单链表、双链表、循环链表。单链表思路用value数组储存值,head代表头节点,只需用一个next数组存储下一个数的下标代码实现#include<bist/stc++.h>using namespace std;const int N = 1e6 + 10;int head;//表示头节点的下标int value[N]

2022-03-19 16:11:07 1629

原创 acm总结——快速排序

算法思想将区间以某个点分为两部分,其中一部分放比这个点小的数,另一个区间放比这个点大的数算法实现在一个数组q[ ]的区间[L, R]里,取一个x = q[L + R >> 1],设两个指针,一个i = L - 1,另一个为j = R + 1,让两个指针进入while循环,以从小到大排序为例,当i指针跑到一个大于x的数则停下,j反之,然后交换q[i]和q[j],直到i>=j退出循环代码实现#include<bits/stdc++.h>using names

2022-03-16 19:51:58 429

原创 acm总结——归并排序

原理:运用分治的思想,例如我们把一个无序数组分成[1, mid],[1, mid + 1]两个区间,将其分别排序完后再合并,当我们使用递归分成若干个区间后,当区间中仅有一个数便不需要先将区间排序再进行合并,我们只需回溯到上一个区间,最后便能得到一个有序序列。操作:我们分别需要进行两个操作:分割区间和归并区间分割区间:我们可以利用递归,取一个L和R两个端点,每次取mid = (L + R) >> 1,然后递归一下(L, mid)、(mid + 1,R)两个区间,直至只有一个数归

2022-03-14 20:51:32 349

原创 acm总结——悬线法(动态规划)

悬线法的作用解决最大子矩阵问题,时间复杂度为O(nm)。原理对于一个n*m的矩阵,其中有若干个障碍,我们需要找到一个没有包含障碍的最大子矩阵。我们可以以一个点为起点,向上延伸出一条竖线并让其左右移动,直至移动到障碍或者矩阵的边界,进而就可以确认出一个矩阵,再遍历每一个点就能找到最大子矩阵。操作首先我们可以定义一个二维数组h[i][j]用于表示悬线的长度。对于每一个点,倘若他正上方的点满足题目所要求的条件(like:题目要求求没有障碍的最大子矩阵,那么满足条件便为无障碍的点),那么这一个点

2022-03-13 14:35:17 1511

原创 acm总结——0-1背包(动态规划)

【01背包问题描述】给定N件物品和一个容量为为C的背包,第i件物品的重量为w[i],价值为是v[i],每件物品只能使用一次,求解将哪些物品装入背包后物品价值的总和最大?【问题分析】对于每种物品其实只有两种状态——取或者不取,并且同一件物品不能装入多次。使用暴力解法去遍历每种情况将会是一个O()的时间复杂度,n代表物品的数量。这里的时间复杂度是指数级别的,所以需要用动态规划来进行优化。【解决办法】1.二维dp数组【分析】我们以F[i, j]表示从前i个物品中选出了总体积为j的物

2022-03-11 11:15:46 1690

空空如也

空空如也

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

TA关注的人

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