ACM算法
文章平均质量分 83
对于算法的总结与心得
青色流苏
zfc
展开
-
数论(2)
- 剩下这部分可以说是数论的重难点了,虽然都是在学校大部分过了一遍的,不过这段时间重新认真看过才感觉当时是啥也没看明白啊,可能第一遍的原因,也可能当时也还没考试的原因心不在焉吧。认真仔细琢磨后才体会到这东西有时也还是挺有意思的,感觉解决问题的方法很神奇,神奇的就像自己被耍了一样,还被耍的很开心。。。 重又看过一次的东西在整理时还会再看一次,这次我忽然看明白了点东西。先前我认为书中没有对于逆元专门的讲解,也没看到多少对逆元的应用,不过这次再看的时候忽然发现好多地方都用到m’、n’,而且因为每次应用都会原创 2021-02-02 01:00:21 · 194 阅读 · 0 评论 -
数论(1)
- 数论这章,其实看书中的内容,感觉东西也没那么多。当然,内容还是很好的,但整章中却没有对于逆元相关介绍,讨和应用,要知道在数论这块逆元还是有很大作用的,所以这块要从其它书上找找看看补一下了。 整除性。书里让我很不舒服的一点是,它的整除符号不是“|”而是"\",我虽然不是不分左右但整除符号和除号“/”放在一起还是容易混淆,看起来费劲。基于整除性的讨论无非是gcd和lcm了,这也没什么难点。不过这里在欧几里得算法的正确性时引入的mm’+nn’=gcd(n,m)倒是恰好就是扩展欧几里得算法的核心式子,而原创 2021-01-28 00:37:03 · 182 阅读 · 1 评论 -
学期训练总结——大二上学期
- 又是一个学期过去了。在学期开始时总会觉得一个学期很长,就像刚放假时会觉得暑假那么长足够好好玩了,可等时间过去后回过头来才感觉到时间原来过的那么快。然后再回想一下自己都做了什么,总会觉得好像做了很少很少的事情,却也找不出时间都花在哪了。。 这学期我的训练也是特殊了。开始时跟着以做题为主,本来就在代码方面比较差,结果训练效果差,继而越来越差,当时真的是对自己挺没信心的。我倒是没想过放弃,只要坚持下去就好,只是怕辜负队友们的努力。之后转变了方向,暂时减少(后半部分时间几乎就是放弃了)代码的训练,去专攻原创 2020-12-23 23:36:27 · 216 阅读 · 0 评论 -
整值函数小结
- 所谓整值函数,其实就是主要围绕顶和底运算展开的,当然提了一下取模运算,算是为下一章数论内容铺下路吧。 其实对于顶和底他们本身,并没有什么复杂性,但当利用它去讨论各种问题时,就发现并没有想象中那么简单了。但要知道的是,顶和底更方便的是去描述一个问题,而通过对它的处理可以改变解决问题的方法,由讨论实际问题转向数学模型的处理。 这里我觉得取模运算的出现位置不太好,顶和底的递归与和式应该放在一起。毕竟其实这部分内容的重点与难点就是这些了。其实到这里就能看到处理和式的意义了,或者说渐渐体会到处理和式在原创 2020-12-07 00:54:30 · 409 阅读 · 0 评论 -
和式
- 这周终于啃完了和式的内容,对和式大体有了认知了。说实话看这块的内容挺有挫败感的,对于这一类问题的处理完全依赖于高中对于数列的相关内容上,其实高中数列方面的知识也没那么水,但直接一个方法一个方法的学习,学会的只是一个对某一固定形式的题目处理方法,而真正解决问题的方法思想不会去考虑。所以自以为会了,其实只是很熟练的解决那一类问题了,所以忘起来很容易。 在我看来,学习一个知识,大约有四个阶段:接受了,明白了,掌握了,会了。对于高数等学科,即使考研题目,也只要求掌握了就好,核心思想能够理解即可。但ACM原创 2020-11-22 22:30:09 · 414 阅读 · 1 评论 -
递归问题题目
- 递归部分内容算是彻底完成了,差强人意,不过还说得过去。题目都还是挺好的,对于思维训练方面也是挺全面的。其中印象最深的有四个题目:一、三个圆做成的维恩图可以描述三个给定集合的8个子集。我尽量列了好多可能的集合,花了不少时间,也没搞明白所谓的这8个集合是哪八个(能够找出来的可不止八个)。但在找的过程中(因为问题是四个圆能够表示多少个子集个数)忽然转移了注意力,想找一下n个圆能够构成的可能集合数。列举后直观的去找规律。因为其实表示的集合其实就是“交”“并”“补”运算能够得到的集合数。初步的想法是组合数原创 2020-11-12 13:46:17 · 206 阅读 · 0 评论 -
递归问题
书到手了,所以开始对数学发起进攻了。第一章讲解递归问题,内容一下午很快就过完了,其实就讲解了三个问题。 第一个是很熟悉的河内塔问题,毕竟已经接触过了,而且内容也较简单。其实这个问题还是主要为了介绍解决这类问题的一般步骤,通过研究较小情形以寻找规律,在推广到一般情形以进一步证实一般规律得到递归式,接着根据递推式求得相应的封闭式,此封闭式称为问题的递归解。在运用到计算机时,很多时候推导出递归式就可以解决大部分问题了,毕竟封闭式能够实现差不多O(1)的复杂度实在很难,而且在数据是变化的情况下很多情况是不存在的原创 2020-10-29 23:55:33 · 330 阅读 · 2 评论 -
组合数学基础
- 这周虽然说有个国庆小假期在,但我们那天本来就没课。而且因为这周发生了一些意外的事,导致这周的训练任务做的不怎么到位(基本都是几个没课的小空闲时间学习的),就连这周讲课也没能去听下(那可是我的舍友)。当然,数论其实本来打算是要刷点题的,不过实在没能打起精神来。cf的比赛也是报名了又退了,越来越熬不住了。不过这周原本就打算看下组合数学相关的东西的。其实先前也是大体浏览过这方面的东西的,不过并没有详细看下,这里就小小的总结下吧。1.加法原理,乘法原理: 可以说是最基本的了。不过仍要注意,加法原理原创 2020-10-05 00:09:07 · 420 阅读 · 0 评论 -
数论——基本框架
忽然觉得上周做的课件其实对于数论方面的学习是一个很好的思路体系(其实我也就是按照我的思路来展开的),所以放在这里一边深入研究或者复习时方便。原创 2020-10-05 00:05:13 · 156 阅读 · 1 评论 -
数位动态规划
- 如果发现有些数位题目需要处理的数据多,而且单个数处理数位计数时会随着数的变大越来越麻烦(通常都这样),就适合这种方法或者这种思想解决问题。 因为通常遇到这方面的题目通常会考察一个连续区间内符合某条件的数,这样可以将单个数的位操作合一,直接看题目条件内所有的数的条件符合情况,即直接处理所有数可能的所有位以计算所有位的数可能出现的情况,在将题目给出的数据或数据范围的边界值对应后得到题目要求的结果。 求不大于n的所有数在2进制小包含K个1的数个数(原题是不大于n的可以用K个不相等的2的幂表示的数)原创 2020-08-11 21:33:24 · 530 阅读 · 1 评论 -
单调队列优化动态规划
- 顾名思义,是通过单调队列对题目信息预处理后(得到一定的单调性)再进行动态规划。 通常,这里单调队列需要维护的单调性不再只是一个值了,可能这时单调性的判断标准除了原本的元素值之外还有元素下标亦或元素值不单一。这样之后再dp求解问题会相对变简单。 这样处理后能够一定程度上优化时间复杂度和空间复杂度。这样做某种意义上缩短原始数组长度,即进行dp时实际处理的数据量减少。还有很重要的一点,这样做可以实现降维,可能降dp的维度,也可能原始数组降维。考虑到实际题目对空间复杂度的要求并不严格,所以降维的间接原创 2020-08-11 21:27:46 · 317 阅读 · 0 评论 -
最小生成树
定义: 在一个有n个顶点的无向连通图中选择n-1条边以连通所有顶点,且选择的这n-1条边的权值总和最小,这样生成的子图称为这个图的最小生成树,而其它边权值总和大于它的子图为这个图的生成树。特点: 有n-1条边,所有点都是连通的,但删掉任意一条边后就会有点不连通,且任意两点之间只有唯一一条简单路径(但在原图中不见是最短路径),而且这个最小生成树中不会存在环。唯一性: 如果一个图中所有边的边权值都不相同,则该图一定有一个唯一的最小生成树,否则不一定唯一。求解最小生成树总边权值和的方法:一、P原创 2020-08-07 00:09:04 · 288 阅读 · 0 评论 -
图的连通性
一、判断图是否连通1.修改Floyed算法(O(n^3)) 原先的dis数组由记录距离改为记录是否连通(布尔值)。 for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { dis[i][j]=dis[i][j]||(dis[i][k]+dis[k][j]) }2.遍历算法(O(n^2)) 其实就原创 2020-08-07 00:06:43 · 497 阅读 · 0 评论 -
最短路径问题
有些时候需要求一个图中两点间的最短路径,在不带边权值时一般是求解最短(长)路径长度,带边权值时可能求结最短(长)路径长度,还可能求解最小(大)边权值和,而有时边权值还可能为负。问题会很复杂,有四种解决方法:一、Floyed-Warshall算法(O(n^3)) 最简单最直接的算法,时间复杂度最高,但也是最万能的算法。能够处理出现负边权的情况,但不能处理存在负权回路(负环)的情况(即某个环的总权值是负值)。 方法就是通过建立另一个数组直接记录两点间的路径,逐步更新以得到最短路径。具体方法是遍历...原创 2020-08-05 19:43:08 · 609 阅读 · 0 评论 -
图
一、图1.概念 点用边连起来就是图,其包含一些点和一些以这些点为端点的线。2.基本术语(1)有向图和无向图:有向图的边是有方向的,或者说这个图包含的边都是向量。无向图相反,都是一般的线段。(2)结点的度:无向图中与某一点或者说结点相连的线段条数即这个结点的度。而有向图中结点有入度和出度,入读即为由其它结点指向此节点的边的条数,出度相反,指由其它结点指向此结点的边的条数。(3)权值:指边的“费用”,碰到的实际问题中,边都会存在某一个值或几个值,可能是边的长度,可能是边的位置决定的一个价值,抑或包原创 2020-08-04 21:32:21 · 735 阅读 · 0 评论 -
二叉树和二叉堆
一、二叉树1.基本概念 二叉树是一个特殊的树,其中每个结点最多只能有两个子结点,也可以为空树。二叉树每个结点最多两个孩子,也就最多只能有两个子树,分别称为左、右子树,左、右子孩子。 一棵树中除了叶子节点外,其余所有结点都有两个孩子,称为满二叉树。而如果由一个满二叉树缺失掉最高层级的最右端部分结点的树,称为完全二叉树。对于完全二叉树,叶子结点只会出现在最高的两个层级,且如果一个结点有左孩子结点,那么它必定有右孩子结点。2.性质(1)二叉树的第i层上,最多只能有2^(i-1)次方个结点。 因为原创 2020-08-04 21:31:14 · 918 阅读 · 0 评论 -
链表——树
一、链表1.链表结构 链表基本结构是一个data数据区加存储位置的变量。数据域即链表用来存储数据,而还需要存储链表中多个数据域之间的位置关系,可以用指针存储相关位置的地址,也可以用其它方式进行存储。这两部分组合在一起就构成了一个“node”结点,而一个一个的结点连接起来组合在一起,就构成了一个链表。为了方便找到这个链表的位置,需要定义一个单独的变量来存储链表的头一个结点,称这个变量为链表的头指针。当然,这个头指针可以仅用来指向链表的头节点,不过多数情况,为了方便对整个链表进行相关操作,可以把头指针定义原创 2020-07-28 00:01:12 · 728 阅读 · 0 评论 -
ACM结课总结
- ACM课结课了。 回想一下,当初这门选修课被老师安排到了所有学生的课表中,之后说不想上可以取消。结果光计算机专业就近三百人,加上其它专业,最终只有二三十个人留下了这门课,应该是被费老师成绩考核严厉的名声吓住了。当时我根本没犹豫,直接就留下来了,那时我很自信,我能够做好,不会挂科的,而且我也确实想学习ACM相关的知识。 说实话,最初对ACM产生兴趣还是因为这个比赛含金量,而选这门课的同学应该大部分都是奔着能够进入我们学校ACM的校队来的,更是以能够代表学校踏上ACM比赛的赛场为目标。毕竟“不想原创 2020-06-15 00:46:37 · 1134 阅读 · 3 评论 -
二三分法
- 数论也开始了。这部分练习得早做了。以前认为若只追求这门课不挂科就落得了下乘,但如果还吊儿郎当的这么干,最后不及格了那可不是一般的不好看。虽说不见得会挂科,但必须承认,学过的算法我真不敢说掌握了,只能说大体了解了,真正遇到问题,,,,算了,打cf我都做不到需要算法的那些题目~ (1)二分法 很早就听说什么二分,二分了,大体知道它是要分成两半去找答案,然后效率很快(当时也根本不懂O(logn)到底是个什么意思),但没有真正去学习一下(在当时看来,没啥用),因为以前做的在oj上的题目大部分都是以掌原创 2020-05-10 23:45:22 · 378 阅读 · 0 评论 -
动态规划-背包问题(2)
- 二三分都讲完了,我还在磨背包问题,貌似磨着磨着脸皮就厚了。记得以前还不懂一个不在同一专业的高中同学为什么能做到那么懒,以至于最后复习阶段每一科不都在担心着会挂科,现在看来我理解了。开学的消息有眉目了,不过最早也得五月十五以后。说实话开学以后我还怎么看回放啊! 还是继续背包问题。 (3)多重背包 一般形式: 变化很清晰,和完全背包相比每种物品的数量不再是无限了,而是有限...原创 2020-05-03 22:55:24 · 199 阅读 · 0 评论 -
动态规划-背包问题(1)
- 刚开始听到背包问题时就感觉很熟悉,当老师举出基本的背包问题时就瞬间想起来贪心部分的背包问题,实在没有想明白到底区别在哪。于是我就去搜了一下动态规划这部分的背包问题是否能用贪心的方法解决,答案都是不能,而且都举出了直接明了的例子来证明确实不能,但是都没有具体解释一下为什么不可以或者说这两种背包问题间的区别。所以我又回去看了一下贪心部分的背包问题,仔细琢磨了一下才明白了这其中的不同之处。 ...原创 2020-04-26 22:33:55 · 311 阅读 · 0 评论 -
区间动态规划
- 又是一周,课程已经讲到背包问题了,我却连区间dp都还没解决好,实在自己都感觉最近的学习训练太差了。对别人来说,疫情当前,在家呆着对于这门课有益,但对我来说恰恰相反,在家事实在多,已经有好几门课自我感觉落下了,真心期待开学。而且,还有种感觉,即使我挺喜欢学习这些算法,去花功夫钻研这些题目,但一旦放下几天就会怠惰,不想去重新拾起来。不过说到底,这些都是借口,结果总还是那好几门科目为自己埋下一颗...原创 2020-04-19 22:56:54 · 271 阅读 · 0 评论 -
线性动态规划(2)
- 这周动态规划的训练结束了。回想下在做题时遇到的这样那样的问题,感觉在减少程序的时间复杂度上还是有一定困难。我也搜了好多有关减少时间复杂度的方法,但并不全面,不过还是有不少有用的东西的,也能够找到很多意想不到的解决方法,比如: 当然,还有很多描述什么是算法的时间复杂度以及怎样计算的,但但多语言比较专业,半懂不懂,但总的来说还是有所收获的。 回到重点,动态规划,这周在做题时我总在...原创 2020-04-06 23:45:54 · 196 阅读 · 0 评论 -
线性动态规划(1)
- 又是一周,还没开学。网课有网课的优点,但上网课的缺点已经在我这发挥的淋漓尽致了。不过,敲代码好像成了一种特殊的乐趣,混不自觉地从其它科目榨取着时间,啧啧,开学越晚,要补的越多。所以,快开学吧。 言归正传,动态规划,先来看看这个名字。与贪心相比,贪心的名字更注重于描绘这种算法的神,而动态规划则直截了当地刻画它的形。因此,但从名字就能看出来,这一算法解决的一类问题的特点就是动态,动态的过程...原创 2020-03-29 22:20:18 · 366 阅读 · 0 评论 -
贪心(2)
- 又是一个“充实”而又“美好”的一周,在如此愉悦的一周,我们贪心部分题目得以延期,我也非常“高兴”地还是没能完成~~ 反思一下,总是在代码实现中出现这样那样的问题,在脑海中对一个题形成一种思路后并没有再思考一下该怎样合理布局以实现自己的算法,而是匆匆忙忙下开始写代码,导致写着写着就会发现其它部分的漏洞需要去填补,有点顾此失彼,捉襟见肘。多花时间是一会事,而造成的有些错误是可以察觉的,而还...原创 2020-03-22 23:07:43 · 120 阅读 · 0 评论 -
贪心(1)
- 这一周讲的贪心算法部分,让我真心感受到这一算法的难度了,也终于感受到反复修改一个题的代码无法ac而抓耳挠腮的心情了。 贪心算法,可以将一个复杂问题层层分解,得到的每一个小问题都能够选择出某一局部上的最优解,最终能够得出整个问题的结果。表面看起来,这一算法的思想与递归很类似,但真正实用时却大相径庭。首先,相似之处便是需要将问题层层分解成若干个小问题,通过解决这些小问题来拼凑出整个大问题的...原创 2020-03-15 23:34:23 · 159 阅读 · 0 评论 -
递归
- 递归,一个看似不简单,其实确实不简单的算法。但既然有这么种算法,必定是用来简化问题的,就看你是否抓住它的命脉所在。 遇到问题,首先要判断,这个题是否能够用递归的方法解决,以及,用递归的方法相比而言(或者对你而言)是不是更简单的方法。怎么判断呢?首先得知道递归算法是什么吧。 程序直接或间接调用自身的编程技巧称为递归算法。。。 看似精辟,实则没任何用的一句话。这让我想起来曾经的数学...原创 2020-03-08 19:08:25 · 174 阅读 · 0 评论