随笔分类 - 算法合集
本人学算法的过程
摘要:0地宫取宝 - 蓝桥云课 (lanqiao.cn) 对于该问题,首先是个迷宫问题,于是先考虑暴力求解,对于暴力来说,有这样一种方法: 对于任何一点来说,都可以进行选或者不选,然后当走到终点时如果符合条件则答案加 $1$,这样做的时间复杂度是 $2^n 也就是 2^50$,很明显得不到满分. 既然是迷
阅读全文
摘要:首先是单调队列: 其实单调队列就是一种队列内的元素有单调性(单调递增或者单调递减)的队列,答案(也就是最优解)就存在队首,而队尾则是最后进队的元素。因为其单调性所以经常会被用来维护区间最值或者降低$DP$的维数已达到降维来减少空间及时间的目的。 类似于滑动窗口等,单调队列具有时序性的储存区间最大值或
阅读全文
摘要:本章节部分参考:2020,2021 年 CF 简单题精选 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) T1:Problem - B - Codeforces 首先,很容易观察到点的一些特征: - 都在第一象限;- 点的分布越来越稀疏。 以样例为例: 还有无限个点没有画
阅读全文
摘要:尼姆($nim$)游戏: P2197 【模板】Nim 游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 对于博弈论游戏,如果当前的选手具有控制权的话,那么当前选手是必赢的,也就是当前选手做出的这步选择后,之后的局面都是在其预料之中的,换句话说,先掌握了控制权即赢. 考虑什么情况
阅读全文
摘要:区间DP具有两种形式的模板 这里以P1775 石子合并(弱化版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)为例 第一种是枚举区间长度然后进行动态规划: 枚举合并的区间然后进行递推: #include<bits/stdc++.h> using namespace std; co
阅读全文
摘要:逆序对定义:对于给定的一段正整数序列,逆序对就是序列中 $a_i>a_j$ 且 $i<j$ 的有序对。 P1908 逆序对 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc++.h> #define int long long usi
阅读全文
摘要:主要是在棋盘上的DP,棋盘上每个点的转移状态基本上都是已知的 //https://www.luogu.com.cn/problem/P1896 //压状dp //由于时间复杂度达到了指数级复杂度,所以搜索不能进行 //考虑动态规划,dp i,j,k表示 第i行,使用了j个国王,此时的状态是k //
阅读全文
摘要:【动态规划】滚动数组的求解(C++) - 林、Zephyr - 博客园 (cnblogs.com) 【精选】滚动数组(简单说明)_儒rs的博客-CSDN博客 //https://www.luogu.com.cn/problem/P2679 /* # 定义状态 # 对于任意一个 0 <= i <= n
阅读全文
摘要://http://ybt.ssoier.cn:8088/problem_show.php?pid=1302 #include<bits/stdc++.h> using namespace std; const int N=2e5+10; int dp[N][3][3],n,w[N],t; int m
阅读全文
摘要:迭代加深: //迭代加深搜索 //给搜索设定一个范围,如果在这个范围内没有答案那么再加大搜索范围 //这么做是为了防止搜索过深,导致利用大量时间搜索无用信息 //如果当前搜索是第10位,搜索的是个二叉树,那么前9个就是2^0+2^1+2^2+..+2^9=2^10-1,所以时间复杂度并没增大太多 /
阅读全文
摘要:预计时间一个月,一天的量为1-2道左右,难度不均,黄-紫都有,后阶段紫 // https://www.luogu.com.cn/problem/P4141 // 对于任何一个物品对答案的贡献都是从1到n递推过去的,所以 // 只需要开一个相同的数组然后从头遍历一遍,把该物品对答案的贡献减去就可以了
阅读全文
摘要:杨辉三角: //https://www.luogu.com.cn/problem/P1118 //最优性剪枝: //由高中知识可得,abcd四个数符合杨辉三角的数相乘,即 //res=a+3*b+3*c+d,前面的常数项也就是杨辉三角的数字 //根据此结论,进行剪枝 //由于暴力枚举全排列+部分剪枝
阅读全文
摘要://http://codeforces.com/problemset/problem/1690/E //利用set数组 里面储存的是 每一个数字%k之后的数字,由于特殊性,一个数大于k,那么就算这个数+0他对答案的贡献最少也是 m/k的价值 //所以可以直接计算价值,然后第二位储存编号,便于分辨 /
阅读全文
摘要://https://www.luogu.com.cn/problem/P3865 //类似于动态规划和压状dp //f[i][j]是从i位置开始到i+2^j-1的区间内的最大值,一步一步更新所有区间的最大值 //有距离限制,即到达某一位置时,j可能过大导致越界,所以对与每个i,有区间属于:[1,n-
阅读全文
摘要:节点(Node):树形结构中的基本单位,可以表示数据元素或对象。节点可以包含一个或多个子节点。 根节点(Root Node):树的顶层节点,它没有父节点,是整个树的起点。 子节点(Child Node):树中每个节点都可以有零个或多个子节点,子节点是位于其父节点下方的节点。 父节点(Parent N
阅读全文
摘要:状态压缩也就是把多个状态都转译成一个状态,由于题目的题意就是需要一步一步递推也就是dp,但是常规的dp只能计算一个状态,无法满足多个状态,所以可以使用状态压缩. 将这多个状态划分为二进制形式:设有$m$个状态,那么所有的可能状态为 $2^m$ ,如果有4个状态,$0010$ 表示只满足了第二个状态,
阅读全文
摘要://组合数 // O(n^2),预处理递推 //n 1~2e3 #include<bits/stdc++.h> using namespace std; const int N=1e3+10,mod=1e9+7; int n,m,c[N][N]; int main() { cin>>n; for(i
阅读全文
摘要:首先,DAG求最短路是有四种方法,分别是 SPFA,Dijkstra,拓扑,记忆化深搜 注意,求最长路只有三种,Dijkstra不适用于最长路,我tm纠结了3个小时,操操操操操操操操操操操 // //车站分级 // //https://www.luogu.com.cn/problem/P1983 #
阅读全文
摘要:树的重心:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡。使得以该节点为根的子树中,最大子树高度最小的节点 //会议 //https://www.luogu.com.cn/problem/P1395 // f数组:f数组用于记录以每个节
阅读全文
摘要://单点修改查询 //http://ybt.ssoier.cn:8088/problem_show.php?pid=1549 //https://www.luogu.com.cn/problem/P1198 //用一维数组来存,当作完全二叉树来存 #include<bits/stdc++.h> us
阅读全文