
基础算法
Cuzblind
这个作者很懒,什么都没留下…
展开
-
关于数位dp的解法(DFS法)
数位dp的前置知识是数位搜索,题目可能有前导零或者其他限制有关数位搜索的视频大佬的详细解释个人更喜欢这个大佬写的模板,更容易理解北大附中教练的视频感觉讲的也挺好的看完这三部分,就是大量的刷题了...原创 2021-10-18 19:54:46 · 164 阅读 · 0 评论 -
338. 计数问题
思路:个人认为最难理解的应该是dp[N][N]这个元素的作用,这个元素实际上的作用其实是防止dfs的时候重复计算很多相同的步骤,当dp != -1时说明,这个地方在没有前导零和无限制的情况下已经计算过了,后面的可以直接使用计算过的数字来使用,看过很多帖子都美誉说明dp数组的作用,dp数组的含义是回溯的关键代码:# include<iostream># include<algorithm># include<cstdio># include<cstri..原创 2021-10-18 19:50:21 · 154 阅读 · 0 评论 -
900. 整数划分
思路:代码:# include<iostream># include<algorithm>using namespace std;const int N = 1010,mod = 1e9 + 7;int n;int f[N][N];int main(){ cin >> n; f[1][1] = 1; for(int i = 2;i <= n;i++) { for(int j = 1;j <.原创 2021-09-27 17:05:44 · 71 阅读 · 0 评论 -
899. 编辑距离
思路:同最短编辑距离代码:# include<iostream># include<algorithm># include<string.h>using namespace std;const int N = 15,M = 1010;int n,m;char str[M][N];int f[N][N];int edit_distance(char a[],char b[]){ int la = strlen(a + 1),lb = s.原创 2021-09-27 15:50:44 · 91 阅读 · 0 评论 -
902. 最短编辑距离
思路:代码:# include<iostream># include<algorithm>using namespace std;const int N = 1010;char a[N],b[N];int n,m;int f[N][N];int main(){ scanf("%d%s",&n,a + 1); scanf("%d%s",&m,b + 1); for(int i = 0;i <= m;i+.原创 2021-09-27 14:29:44 · 108 阅读 · 0 评论 -
896. 最长上升子序列 II
思路:大佬题解代码:# include<iostream># include<algorithm>using namespace std;const int N = 100010;int a[N];int q[N];int n;int main(){ scanf("%d",&n); for(int i = 0;i < n;i++) scanf("%d",&a[i]); q[0] = -2e9;//省得.原创 2021-09-27 09:14:22 · 76 阅读 · 0 评论 -
282. 石子合并
思路:核心:最后一次合并一定是左边连续的一部分和右边连续的一部分进行合并根据最后一次合并的那个点来划分集合代码:# include<iostream># include<algorithm>using namespace std;const int N = 310;int n;int s[N];int f[N][N];int main(){ cin >> n; for(int i = 1;i <= n;i++) .原创 2021-09-23 17:42:49 · 91 阅读 · 0 评论 -
897. 最长公共子序列
思路:代码:# include<iostream>using namespace std;const int N = 1010;int n,m;char a[N],b[N];int f[N][N];int main(){ cin >> n >> m >> a + 1 >> b + 1; for(int i = 1;i <= n;i++) { for(int j = 1;j &.原创 2021-09-23 16:31:52 · 93 阅读 · 0 评论 -
898. 数字三角形
思路:代码:# include<iostream># include<algorithm>using namespace std;const int N = 510,INF = 1e9;int a[N][N],f[N][N];int main(){ int n; scanf("%d",&n); for(int i = 1;i <= n;i++) for(int j = 1;j <= i;j++) .原创 2021-09-16 15:16:47 · 105 阅读 · 0 评论 -
891. Nim游戏
思路:大佬题解代码:# include<iostream>using namespace std;const int N = 100010;int n;int main(){ cin >> n; int res = 0; while(n--) { int a; cin >> a; res ^= a; } if(res) puts("Yes"); e.原创 2021-09-16 14:27:47 · 99 阅读 · 0 评论 -
890. 能被整除的数
思路:代码:# include<iostream>using namespace std;typedef long long LL;const int N = 20;int p[N],n,m;int main(){ cin >> n >> m; for(int i = 0;i < m;i++) cin >> p[i]; int res = 0; //枚举从1 到 1111...(m个1).原创 2021-09-15 17:00:12 · 163 阅读 · 0 评论 -
888. 求组合数 IV
思路:流程:来源大佬题解代码:# include<iostream># include<algorithm># include<vector>using namespace std;const int N = 5010;int primes[N],cnt;int sum[N];//每个质数的次数bool st[N];//筛素数,把1−5000之间的素数筛出来。void get_primes(int n){ for(int.原创 2021-09-14 17:52:31 · 138 阅读 · 0 评论 -
889. 满足条件的01序列
思路:代码:# include<iostream>using namespace std;typedef long long LL;const int mod = 1e9 + 7;int qmi(int a,int b,int c){ int res = 1; while(b) { if(1 & b) res = (LL)res * a % c; a = (LL)a * a % c; b .原创 2021-09-14 16:47:53 · 86 阅读 · 0 评论 -
887. 求组合数 III
思路:代码:# include<iostream>using namespace std;typedef long long LL;int qmi(int a,int b,int c){ int res = 1; while(b) { if(b & 1) res = (LL)res * a % c; a = (LL)a * a % c; b >>= 1; } retur.原创 2021-09-13 17:40:59 · 113 阅读 · 0 评论 -
886. 求组合数 II
思路:预处理出来阶乘因为a/b%p!=a%p/b%p,所以先预处理出来b的逆元代码:# include<iostream>using namespace std;typedef long long LL;const int N = 100010,mod = 1e9 + 7;int fact[N],infact[N];//快速幂int qmi(int a,int b,int c){ int res = 1; while(b) { .原创 2021-09-13 16:16:47 · 117 阅读 · 0 评论 -
885. 求组合数 I
思路:代码:# include<iostream>using namespace std;const int N = 2010,mod = 1e9 + 7;int a[N][N];void init(){ for(int i = 0;i < N;i++) for(int j = 0;j <= i;j++) { if(!j) a[i][j] = 1; else a[i][j] .原创 2021-09-13 15:08:20 · 96 阅读 · 0 评论 -
878. 线性同余方程
思路:代码:# include<iostream># include<algorithm>using namespace std;typedef long long LL;int exgcd(int a,int b,int &x,int &y){ if(!b) { x = 1,y = 0; return a; } int d = exgcd(b,a % b,y,x); y -.原创 2021-08-22 16:26:26 · 112 阅读 · 0 评论 -
877. 扩展欧几里得算法
思路:代码:# include<iostream>using namespace std;int exgcd(int a,int b,int &x,int &y){ if(!b) { x = 1,y = 0; return a; } int d = exgcd(b,a % b,y,x); y -= a / b * x; return d;}int main(){ int.原创 2021-08-22 15:37:46 · 72 阅读 · 0 评论 -
876. 快速幂求逆元
思路:来自大佬题解代码:# include<iostream># include<algorithm># include<cstring>using namespace std;typedef long long LL;LL qmi(int a,int b,int p){ LL res = 1; while(b) { if(b & 1) res = res * a % p; a =..原创 2021-08-21 17:01:09 · 108 阅读 · 0 评论 -
875. 快速幂
思路:代码:# include<iostream># include<algorithm># include<cstring>using namespace std;typedef long long LL;LL qmi(int a,int b,int p){ LL res = 1; while(b) { if(b & 1) res = res * a % p; a = a * (.原创 2021-08-21 16:27:51 · 83 阅读 · 0 评论 -
874. 筛法求欧拉函数
思路:通过线性筛法求素数,从中求出欧拉函数代码:# include<iostream># include<cstring># include<algorithm>using namespace std;typedef long long LL;const int N = 1000010;int primes[N],cnt;int phi[N];bool st[N];void get_ola(int n){ phi[1] = 1;.原创 2021-08-21 15:43:08 · 108 阅读 · 0 评论 -
873. 欧拉函数
思路:欧拉函数:代码:# include<iostream># include<algorithm>using namespace std;int phi(int x){ int res = x; for(int i = 2;i <= x / i;i++) { if(x % i == 0) { res = res / i * (i - 1); while.原创 2021-08-15 16:51:04 · 92 阅读 · 0 评论 -
872. 最大公约数
代码:# include<iostream># include<algorithm>using namespace std;int gcd(int a,int b){ return b ? gcd(b,a % b) : a;}int main(){ int n; cin >> n; while(n--) { int a,b; cin >> a >> b;.原创 2021-08-15 16:18:03 · 132 阅读 · 0 评论 -
871. 约数之和
思路:代码:# include<iostream># include<algorithm># include<unordered_map>using namespace std;typedef long long LL;const int mod = 1e9+7;int main(){ int n; cin >> n; unordered_map<int,int> primes; while.原创 2021-08-15 15:27:52 · 94 阅读 · 0 评论 -
870. 约数个数
思路:24=2 * 2 * 2 * 3=2³ * 3再用各个质数的指数加一后再相乘即为此数的约数个数,比如 (3+1)(1+1)=42=8, 即表示24有8个约数。24的约数:1、2、3、4、6、8、12、24代码:# include<iostream># include<algorithm># include<unordered_map>using namespace std;typedef long long LL;const int.原创 2021-08-15 14:52:41 · 293 阅读 · 0 评论 -
867. 分解质因数
代码:# include<iostream># include<algorithm>using namespace std;void divide(int x){ for(int i = 2;i <= x / i;i++) { if(x % i == 0) { int s = 0; while(x % i == 0) x /= i,s++; co.原创 2021-08-14 17:16:31 · 107 阅读 · 0 评论 -
866. 试除法判定质数
代码:# include<iostream># include<algorithm>using namespace std;bool is_prime(int x){ if(x < 2) return false; for(int i = 2;i <= x / i;i++) { if(x % i == 0) return false; } return true;}int main(){ .原创 2021-08-14 17:15:11 · 90 阅读 · 0 评论 -
869. 试除法求约数
代码:# include<iostream># include<algorithm># include<vector>using namespace std;vector<int> get_divisors(int x){ vector<int> res; for(int i = 1;i <= x / i;i++) { //如果x能被i整除 if(x % i == 0).原创 2021-08-13 17:38:55 · 118 阅读 · 0 评论 -
861. 二分图的最大匹配
思路:代码:# include<iostream># include<cstdio># include<cstring># include<algorithm>using namespace std;const int N = 510,M = 100010;int h[N],e[M],ne[M],idx;int match[N];//match[j]=a,表示女孩j的现有配对男友是abool st[N];//st[]数组我称为临时预..原创 2021-08-12 16:06:38 · 63 阅读 · 0 评论 -
860. 染色法判定二分图
思路:代码:# include<iostream># include<cstdio># include<cstring># include<algorithm>using namespace std;const int N = 100010,M = 200010;int h[N],ne[M],e[M],idx,color[N];int n,m;//邻接表方式存储图, 无向图可能会连接M条边//color[N], 为0代表还未染色省去.原创 2021-08-12 15:07:47 · 95 阅读 · 0 评论 -
859. Kruskal算法求最小生成树
思路:运用到并查集的方法代码:# include<iostream># include<cstdio># include<cstring># include<algorithm>using namespace std;const int N = 100010,M = 200010,INF = 0x3f3f3f3f;int n,m;int p[N];struct edge{ int a,b,w; boo..原创 2021-08-11 15:34:59 · 180 阅读 · 0 评论 -
858. Prim算法求最小生成树
思路:过程图解:大佬总结代码:# include<iostream># include<algorithm># include<cstdio># include<cstring>using namespace std;const int N = 510,INF = 0x3f3f3f3f;int g[N][N],dist[N];bool st[N];int n,m;int prim(){ memset(dist,0x3..原创 2021-08-10 17:13:52 · 80 阅读 · 0 评论 -
854. Floyd求最短路
思路:f[i, j, k]表示从i走到j的路径上除i和j点外只经过1到k的点的所有路径的最短距离。那么f[i, j, k] = min(f[i, j, k - 1), f[i, k, k - 1] + f[k, j, k - 1]。因此在计算第k层的f[i, j]的时候必须先将第k - 1层的所有状态计算出来,所以需要把k放在最外层。读入邻接矩阵,将次通过动态规划装换成从i到j的最短距离矩阵在下面代码中,判断从a到b是否是无穷大距离时,需要进行if(t > INF/2)判断,而并..原创 2021-08-08 17:51:59 · 135 阅读 · 0 评论 -
852. spfa判断负环
思路:使用spfa算法解决是否存在负环问题求负环的常用方法,基于SPFA,一般都用方法 2(该题也是用方法 2):方法1:统计每个点入队的次数,如果某个点入队n次,则说明存在负环 方法2:统计当前每个点的最短路中所包含的边数,如果某点的最短路所包含的边数大于等于n,则也说明存在环cnt数组表示到达当前这个点最短路的边数,如果cnt[x]>=n,说明至少经过了n条边,即n+1个点,由抽屉原理可知显然有两个点重复,即存在负环代码:# include<iostream>#.原创 2021-08-08 17:28:14 · 106 阅读 · 0 评论 -
240. 食物链
思路:并查集只要有关系,就属于同一个集合,就加入到集合中去(不管是同类or异类)所以边带权的并查集问题本质上只在维护一个大的集合(其他的都是单个点逐一加到大集合里)精髓:只要两个元素在同一个集合里,就能通过他们与根节点的距离知道他们之间的关系。关于d[i]的解释:d[i]的正确理解,应是第 i 个节点到其父节点距离,而不是像有些同学所讲的,到根节点的距离!!这点大家一定要搞清楚,之所以有这样的误会,是因为find()函数进行了路径压缩,当查询某个节点 i 时,如果 i 的父节点不为根节点的..原创 2021-08-07 18:17:36 · 96 阅读 · 0 评论 -
143. 最大异或对
思路:先想暴力的方法,然后进行优化暴力:for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++) { // 但其实 a[i] ^ a[j] == a[j] ^ a[i] // 所以内层循环 j < i // 因为 a[i] ^ a[i] == 0 所以事先把返回值初始化成0 不用判断相等的情况 }}利用trie树:trie树中要明确两个问题:son[N][x].原创 2021-08-06 18:06:03 · 157 阅读 · 0 评论 -
841. 字符串哈希
思路:大概思路是这样的,举个例子,设字符串s下标从1开始(因为处理前缀和要用到0)字符串太抽象了我们拿一个数字举例子吧字符串是这样的(中间没有空格):1 2 3 9 9 1 2 3下标是这样的: 1 2 3 4 5 6 7 8那么我们这个字符串的哈希可以这么设计:如果把这个字符串看成一个p进制数字第i位的哈希值=s[i]*P^i这个字符串的哈希值就可以表示为 1xP1+2xP2+3xP3+9xP4+9xP5+1xP6+2xP7+3xP8然后像正常的数字处理前缀和一样求出前缀和在查询的时.原创 2021-08-04 15:11:22 · 159 阅读 · 0 评论 -
840. 模拟散列表
代码:开放寻址法代码(个人比较喜欢用这种)# include<iostream># include<cstring>using namespace std;const int N = 200003,null = 0x3f3f3f3f;//数据范围的 2~3倍, 这样大概率就没有冲突了,大于数据范围的第一个质数int h[N];int find(int x){ int t = (x % N + N) % N;// c++中如果是负数 那他取模也是负的 所以.原创 2021-08-03 17:17:25 · 112 阅读 · 0 评论 -
839. 模拟堆
思路:首先需要理解的是hp和ph这两个数组到底存的是啥,到底有啥作用hp是heap pointer的缩写,表示堆数组中下标到第k个插入的映射ph是pointer heap的缩写,表示第k个插入到堆数组中的下标的映射hp和ph数组是互为反函数的但是为什么会用ph和hp这两个数组呢?原因在于在删除第k个插入元素的操作中,我们首先得知道第k个插入元素在堆数组中的什么位置,即堆数组下标是啥。很显然,用一个ph数组来存储会方便查找。这样我们就知道了第k个插入的元素在哪了。然后我们需要做的是和堆尾元素..原创 2021-08-03 16:06:30 · 182 阅读 · 0 评论 -
838. 堆排序
思路:分析难点:i为什么从n/2开始down?首先要明确要进行down操作时必须满足左儿子和右儿子已经是个堆。开始创建堆的时候,元素是随机插入的,所以不能从根节点开始down,而是要找到满足下面三个性质的结点:左右儿子满足堆的性质。下标最大(因为要往上遍历)不是叶结点(叶节点一定满足堆的性质)那这个点为什么时n/2?看图。代码:# include<iostream># include<algorithm>using namespace s.原创 2021-08-02 17:12:11 · 169 阅读 · 0 评论