随笔分类 - 我的算法模板
-
算法提高--最长上升子序列一
摘要:https://www.acwing.com/problem/content/897/ 1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 const int N=101 阅读全文
-
算法提高--数字三角形模型
摘要:https://www.acwing.com/problem/content/900/ 注意处理边界即可。 1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 const 阅读全文
-
数据结构--树状数组
摘要:证明参考:https://zhuanlan.zhihu.com/p/297885717(抄的) 树状数组支持的操作:单点修改,区间查询(仅限于支持减法的操作,不支持的例子:max) 树状数组定义:定义C[ i ] 表示的是A [ i - lowbit(i) ] + 1 ~~ A[ i ] 之间的数据 阅读全文
-
数据结构--表达式求值
摘要:https://www.acwing.com/problem/content/3305/ 1 #include<iostream> 2 #include<cstring> 3 #include<string> 4 #include<unordered_map> 5 #include<stack> 6 阅读全文
-
动态规划--状态压缩
摘要:https://www.acwing.com/problem/content/293/ 给定一个空矩阵,问用1*2的矩形将其填满存在多少种方案。 可以只考虑一种,如果横的都已经确定了,那么竖的只有0或者1种放法,所以只考虑横的就好了(只考虑竖的也行) 暴搜复杂度为O(N! * M!),所以只能考虑动 阅读全文
-
动态规划--记忆化搜索
摘要:https://www.acwing.com/problem/content/903/ 记忆化搜索经典题目,滑雪。 只能从高的地方往低的地方滑,问最多能滑多少个点。 如果这个方程用循环来写的话,听说会非常非常麻烦(反正我不会) 所以就有了记忆化搜索。 1 #include<iostream> 2 # 阅读全文
-
动态规划--树形DP
摘要:https://www.acwing.com/problem/content/287/ 所谓树形DP,也就是关系的两边变成了树的上层和下层。 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int N=6 阅读全文
-
动态规划--数位DP
摘要:https://www.acwing.com/problem/content/340/ 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 int get(vector<int> v,int l,int r){ 5 int 阅读全文
-
贪心--区间问题
摘要:1、区间选点问题 https://www.acwing.com/problem/content/907/ 给定n个区间,选择尽量少的点使得每个区间都至少包含一个点,问最少的点的数量是多少。 1 #include<algorithm> 2 #include<iostream> 3 using name 阅读全文
-
动态规划--计数类DP
摘要:https://www.acwing.com/problem/content/902/ 整数划分问题,给定一个正整数n,问有多少种方案使得n=x1+x2+...+xn,不考虑顺序。 解法1:利用完全背包的模型,将1~n每一个数字看成一个物品。 1 #include<iostream> 2 using 阅读全文
-
数据结构--Trie树
摘要:Trie树查找和插入的时间复杂度均为O(n)。 https://www.acwing.com/problem/content/837/ 1 #include<iostream> 2 using namespace std; 3 const int N=1e5+10;//输入字符串的总长度为1e5+1 阅读全文
-
动态规划--线性dp-2
摘要:1、最长公共子序列问题 https://www.acwing.com/problem/content/899/ 写代码时,因为 f ( i-1 , j ) 包含了 f ( i-1 , j-1 ) ,所以一般是不将其写出来的。 初始值的话,根据定义考虑,将 f [ 0 , 0~m ],f [ 0~n 阅读全文
-
动态规划--线性DP-1
摘要:线性DP:在线性空间上进行答案的递推。 1、数字三角形问题 https://www.acwing.com/problem/content/900/ 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int 阅读全文
-
动态规划--分组背包
摘要:状态表示 f[i][j] 集合:考虑前 i 组物品,体积不超过 j 的取法的价值的集合 属性:最大值 状态计算:f ( i , j ) = f ( i-1 , j) , f ( i-1 , j-v1) + w1 , f ( i , j ) = f ( i-1 , j-v2) + w2 .....最大 阅读全文
-
动态规划--多重背包
摘要:题目:https://www.acwing.com/problem/content/4/ 多重背包题意同完全背包,不过多了一个限制,就是每种物品有数目限制。 朴素想法 最朴素的想法就是直接枚举每种物品拿多少个。 1 #include<iostream> 2 using namespace std; 阅读全文
-
动态规划--完全背包
摘要:题目:https://www.acwing.com/problem/content/3/ 完全背包相较于01背包区别在于每种物品的个数是无限的。 按照如上的分析,写出的代码 1 #include<iostream> 2 using namespace std; 3 const int N=1010; 阅读全文
-
动态规划--01背包
摘要:01背包问题 题目https://www.acwing.com/problem/content/2/ 给定n个物品和一个背包,容量为m,每个物品有体积v和价值w两种属性 选择物品装入背包,使得在不超过背包容量的情况下,价值最大。 1 #include<iostream> 2 using namesp 阅读全文
-
博弈论--SG函数
摘要:定义:给定一个有向图,无出边的点的SG值定义为0,其他点的SG值定义为到不了的最小的自然数 具体问题:给定一个石子集合M,再给定一个可以取的数的集合N,求先手必胜还是必败。 所以SG(10) > 0,所以先手必胜。 证明: (1)最终失败态为0 (2)非零一定可以变成0 (3)0一定不能走到0 由S 阅读全文
-
博弈论--Nim游戏
摘要:Nim游戏是博弈论中最经典的模型(之一),它又有着十分简单的规则和无比优美的结论 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games” Nim游戏具体游戏规则为:有n堆石子,两名选手,每个选手可以拿一堆石子 阅读全文
-
基础数论--容斥定理
摘要:在计数时,必须注意没有重复,没有遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。 容斥定理概述: 详细 阅读全文