
紫书学习笔记
文章平均质量分 83
在紫书(《算法竞赛入门经典》)学习过程中的笔记
Avalon Demerzel
ICPC区域赛银牌+退役ACMer
展开
-
【紫书第十一章】图论模型与算法入门
图论基础前言一、无根树转有根树二、表达式树三、最小生成树四、最短路问题1.Dijkstra算法2.Bellman_Ford算法3.Spfa算法4.Floyd算法前言有关图论的更多知识点请移步作者“图论与数据结构”专栏。专栏地址:图论与数据结构专栏一、无根树转有根树问题描述:输入一个n个结点的无根树的各条边,指定一个根节点要求转化为有根树。分析:树是一种特殊的图,我们可以用vector数组来存下这个图。然后定义一个数组p[n],p[i]为i的父节点。代码实现#include<iost原创 2021-08-12 17:42:04 · 612 阅读 · 0 评论 -
【紫书第十章】数论与概率入门
数论与概率入门一、数论初步1.欧几里得算法(辗转相除法)2.素数筛-埃氏筛3.素数筛-欧拉筛4.扩展欧几里得算法5.快速幂二、概率基础1.容斥原理2.杨辉三角和二项式定理3.离散概率基础三、其它数学专题1.汉诺塔2.斐波拉契数列一、数论初步1.欧几里得算法(辗转相除法)在求两个数的最大公因数时,我们通常使用欧几里得算法来求解。int gcd(int a,int b){ if(b==0)return a; else return gcd(b,a%b);}最小公倍数:(a*b)/最大公约数原创 2021-08-11 19:01:01 · 478 阅读 · 0 评论 -
【紫书第九章】动态规划(DP)常见模型汇总与DP问题分析方法
看完了紫书第九章还是有一点迷茫,dp果然是一个比较抽象和困难的知识点,这里结合学长(优快云账号:蹲坑玩手机)上课的课件和看完紫书后自己的一些思考来记录一下dp学习的心得。一、基础dp1.性质:拥有子问题,子问题最优解(即拥有最优子结构),对于一个原问题解最优,其子问题必定也是最优,同时原问题的最优解依赖于其子问题的最优解子问题重复性,一个子问题可能会影响多个不同的下一阶段的原问题无后效性,即此时的之前状态无法直接影响未来的决策,换句话说就是之前的每个状态如何得来并不影响未来对此时(当前)状态的原创 2021-08-10 17:26:34 · 1801 阅读 · 1 评论 -
【紫书第八章】算法的时间优化设计
一、算法的时间优化需要提前知道的知识点:时间复杂度例题:给你一个数组a[N],要求求出最大连续和。1.暴力枚举起点和终点(下策)最不需要动脑子的算法,暴力枚举就可以了。int a[N];void solve(){ int ans = a[1]; for(int i=1;i<N;i++) for (int j = i; j < N; j++) { int sum = 0; for (int k = i; k <= j; k++) sum += a原创 2021-08-07 16:15:45 · 840 阅读 · 0 评论 -
【紫书第七章】暴力美学(能用暴力解决的事情为什么要动脑子?)
一、简单枚举1.寻找被枚举量之间的关系例题博客:紫书 p182 除法 (作者:Barsaker)题意分析:本题看上去是需要枚举两个数字不重复的5位数或4位数(前导0),但是我们发现只要枚举好了第一个数就可以计算出第二个数。然后判断两个数是否数字都不相同。我们可以用一个函数来实现判断两个数是否符合数字不重复这个条件。然后我们可以枚举第一个数字(12345~98765)来确定所有第二个数字。小结:当我们需要枚举两个或更多数字、变量时,我们可以寻找需要枚举的变量之间的关系,通过已经确定的变量来减少需要枚原创 2021-08-06 16:07:40 · 419 阅读 · 0 评论 -
【紫书第六章】二叉树、欧拉图基本概念与性质
一、二叉树的编号对于一个数组tree[N]而言,我们如果把tree[1]作为根节点,那么tree[i]的左儿子节点坐标为tree[i * 2],右儿子坐标为tree[i *2+1]。这是一个非常重要的知识点。例题博客:紫书p148例题6-6 小球下落(作者:maplegam)思路:本题很容易就能想到暴力的思路,但是暴力的时间复杂度并不能让我们解决这一个问题,因此我们需要换一个思路去解决这个问题。书上提到:使用题目给出的编号i,当i为奇数时,它是往左走的第(i+1)/2个小球 。通过这条性质,我们原创 2021-08-05 12:40:43 · 1068 阅读 · 0 评论 -
【紫书第六章】链表(list)、栈和双向队列(deque)
一、链表:list1、用处及优势链表对于一段数据的插入和删除操作具有很大的优势。而在数组、vector中,对于数据的插入与删除操作往往需要较高的时间复杂度。2、STL中list的常见用法 cout << "预设长度和值" << endl; list<int>l1(10, 0); for (list<int>::iterator it = l1.begin(); it != l1.end(); it++) { cout << *it原创 2021-08-04 11:06:57 · 211 阅读 · 0 评论 -
【紫书第五章】String、结构体、部分STL的常见用法
一、String相关1、带空格的字符串输入string a;getline(cin,a);2、字串的截取 string s = "sfsa"; string a = s.substr(0, 3); string b = s.substr(); string c = s.substr(2, 3); cout << a << endl; cout << b << endl; cout << c << endl;输原创 2021-08-03 16:07:10 · 165 阅读 · 0 评论