算法刷题总结
Posted 卷王2048
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法刷题总结相关的知识,希望对你有一定的参考价值。
算法刷题总结
动态规划
提高课dp题解集合
背包问题模板
题目链接 | 题意描述 | 题目总结 | c++题解 | python3题解 | Java题解 | 自己的代码 |
---|---|---|---|---|---|---|
[01背包问题](2. 01背包问题 - AcWing题库) | 背包容量 m m m,物品数 n n n,每个物品只能选一次, | 第一层循环枚举所有物品,第二层循环倒着枚举体积 | ||||
完全背包问题 | 背包容量 m m m,物品数 n n n,每个物品可以无限选 | 第一层循环枚举所有物品,由于不限制每个物品的数量第二层循环正着枚举体积。注意公式的化简过程 | ||||
[多重背包问题](6. 多重背包问题 III - AcWing题库) | 背包容量 m m m,物品数 n n n,每个物品数 s i s_i si, o ( n ∗ m ∗ s ) o(n*m*s) o(n∗m∗s) | 第一层循环枚举所有物品,第二层循环枚举每个物品数量,第三层循环倒着枚举体积 | ||||
5. 多重背包问题 二进制优化 | 背包容量 m m m,物品数 n n n,每个物品数 s i s_i si, o ( n ∗ m ∗ l o g ( s ) ) o(n*m*log(s)) o(n∗m∗log(s)) | 第一层循环枚举所有物品,第二层循环枚举每个物品数量时,用二进制的枚举方法,最后再枚举一次余数,第三层循环倒着枚举体积 | ||||
7. 混合背包问题 - AcWing题库 | ||||||
8. 二维费用的背包问题 - AcWing题库 | 背包容量 v v v,背包限重 m m m,物品数 n n n | 一层循环枚举所有物品,第二层循环倒着枚举体积,第三层循环倒着枚举重量 | ||||
9. 分组背包问题 - AcWing题库 | 背包容量 m m m,物品组数 n n n,同组物品只能选一个 | 第一层循环枚举所有分组,第二层循环倒着枚举体积,第三层循环枚举组内的物品 | ||||
10. 有依赖的背包问题 - AcWing题库 | ||||||
11. 背包问题求方案数 - AcWing题库 | ||||||
12. 背包问题求具体方案 - AcWing题库 |
背包问题变形
题目链接 | 题意描述 | 题目总结 | c++题解 | python3题解 | Java题解 | 自己的代码 |
---|---|---|---|---|---|---|
426. 开心的金明 - AcWing题库 | 裸01背包 | |||||
487. 金明的预算方案 - AcWing题库 | ||||||
3499. 序列最大收益 - AcWing题库 | ||||||
377. 组合总和 Ⅳ | 背包问题求方案数的小变形 | |||||
3382. 整数拆分 - AcWing题库 | 求一个数拆成n个二进制数(可重复,包含1)相加,的方案数 | |||||
139. 单词拆分 | 给定一个有n个字符串的字典,问模板串能否由字典里的 | |||||
5269. 从栈中取出 K 个硬币的最大面值和 | 有s个栈,栈中每个物品有不同价值,每次只能从栈顶取,取n次,使取到的价值最大 | |||||
路径(数字三角形)
题目链接 | 题意描述 | 题目总结 | c++题解 | python3题解 | Java题解 | 自己的代码 |
---|---|---|---|---|---|---|
898. 数字三角形(模板) | 在三角形中,找一条和最大(小)的路径 | |||||
1015. 摘花生 (模板) | 在矩阵中,找一条和最大(小)的路径 | |||||
最低通行费(模板) | 在矩阵中,找一条和最大(小)的路径 | |||||
1212. 地宫取宝 - AcWing题库 | 在考虑路径的同时还要两个其他信息,四维状态5维循环 | |||||
AcWing 275. 传纸条 | 在矩阵中,找一来一回2条和最大(小)的路径,同一个格子不能被重复选择 | 可以等价转换成:两个人同时从起点走到终点,中间两个路径除了起点和终点之外没有交点 | ||||
Acwing1027. 方格取数 | 在矩阵中走两次,求和最大(小)的路径,同一个格子不能被重复选择 | |||||
上升子序列模型
题目链接 | 题意描述 | 题目总结 | c++题解 | python3题解 | Java题解 | 自己的代码 |
---|---|---|---|---|---|---|
895. 最长上升子序列(模板) - AcWing题库 | 遍历每一个数,以该数作为上升子序列的结尾;对于每个数,看它前面的所有数,如果有比它小的数,前边界+1。最后再看看哪个数结尾的上升子序列最大 | |||||
896. 最长上升子序列 II(优化nlogn) - AcWing题库 | 对于每个a[i],把它接在小于a[i]的最大的数的后面,思路与dp无关;由于是往答案里插数,答案是单调递增的,所以可以用二分来找小于a[i]的最大的数 | |||||
897. 最长公共子序列 - AcWing题库 | dp[i,j]表示a的前i个字母,和b的前j个字母的最长公共子序列长度 | |||||
3510. 最长公共子序列(优化nlogn) - AcWing题库 | a数组无重复元素,且a,b长度相同。求数组b’,为数组b在a中出现的位置。b’的子序列,对应一个b的子序列;b’的上升子序列,对应a的一个子序列。所以b‘的最长上升子序列,对应了a和b的最长公共子序列 | |||||
最大上升子序列和 | ||||||
3662. 最大上升子序列和 - AcWing题库 | ||||||
368. 最大整除子集 | 返回给定序列的一个最大子集,满足任意两个数满足整除关系 | 本题的关键是如何存下这个序列 | ||||
怪盗基德的滑翔翼 | 维护正向和反向的最长上升子序列 | |||||
登山 | 求一个先上升后下降的最长子序列 | |||||
AcWing 482. 合唱队形 | 求一个先上升后下降的最长子序列 | |||||
Acwing1012-友好城市 | ||||||
导弹拦截 | 求序列最少被几个最长不升子序列覆盖。思路类似于贪心求最长上升子序列。对于每个 a [ i ] , a[i], a[i],把它接在大于 a [ i ] a[i] a[i]的最小的数的后面。相当于第一问求最长不升子序列,第二问求严格最长上升子序列。因为每有一处上升子序列,说明出现了一次单调性翻转 | |||||
187. 导弹防御系统 - AcWing题库 | 求w[i]用最少的上升子序列和下降子序列完全覆盖该数组求该方案的上升子序列和下降子序列的总个数 | |||||
115. 不同的子序列 | 给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。 | 公共子序列的变形 | ||||
线性dp
题目链接 | 题意描述 | 题目总结 | c++题解 | python3题解 | Java题解 | 自己的代码 |
---|---|---|---|---|---|---|
1473. 粉刷房子 III | ||||||
899. 编辑距离 - AcWing题库 | ||||||
3414. 校门外的树 - AcWing题库 | 一维 | |||||
821. 跳台阶 - AcWing题库 | 每次跳一下或2下,求跳到n的方案数 | |||||
435. 传球游戏 - AcWing题库 | 一个环形上,每个人每次可以选择向左或向右传,求传回自己的方案数 | |||||
403. 青蛙过河 | 给一个石子序列,青蛙一开始可以跳1,连续跳会有加速度,求青蛙是否能从起点跳到终点 | |||||
91. 解码方法 | 求给定字符串映射成字母的方案数 | |||||
状态压缩dp
题目链接 | 题意描述 | 题目总结 | c++题解 | python3题解 | Java题解 | 自己的代码 |
---|---|---|---|---|---|---|
Acwing1064国王 | AcWing 1064. 小国王【线性状压DP+滚动数组优化+目标状态优化】 - AcWing | AcWing 1064. 小国王(Python) - AcWing | ||||
327. 玉米田 - AcWing题库 | ||||||
292. 炮兵阵地 - AcWing题库 | ||||||
NOIP2016 提高组 愤怒的小鸟 | ||||||
529. 宝藏 - AcWing题库 | ||||||
3300. 食材运输 - AcWing题库 | 从图上某个点出发,使要经过所有指定的点的路程的最大值最小 | |||||
1723. 完成所有工作的最短时间 | ||||||
状态机模型
题目链接 | 题意描述 | 题目总结 | c++题解 | python3题解 | Java题解 | 自己的代码 |
---|---|---|---|---|---|---|
面试翻车之——股票专题 - AcWing | 各种限制条件下的交易问题 | |||||
AcWing 1052. 设计密码 - AcWing | KMP+状态机dp(巨难) | |||||
区间dp
题目链接 | 题意描述 | 题目总结 | c++题解 | python3题解 | Java题解 | 自己的代码 |
---|---|---|---|---|---|---|
282. 石子合并 - AcWing题库 | 把n堆石子变成一堆,最少要消耗多少体力 | 先预处理前缀和;枚举区间长度和左端点,枚举中间的分界点k d p [ i ] [ j ] = d p [ i ] [ k ] + d p [ k ] [ j ] dp[i][j] = dp[i][k]+dp[k][j] dp[i][j]=dp[i][k]+dp[k][j]+把这两堆搬到一起的体力,即两段区间和 | ||||
Acwing.1068. 环形石子合并 | n堆石子环形摆放 | 把数组复制一份接在后面,在 2 n 2n 2n上求,区间长度为 n n n,左端点枚举 [ 1 , 2 n ] [1,2n] [1,2n],最后求一下哪一个长度为n的区间值为最值 | ||||
320. 能量项链 - AcWing题库 | 展开的方式只是将 a [ 1 ] a[1] a[1],补在了后面 | |||||
479. 加分二叉树 - AcWing题库 | 只给出一颗二叉树的中序遍历序列,要求还原出一颗分值最大的二叉树 | |||||
1069. 凸多边形的划分 | 虽然看起来是环形,但每个底边都是一样的只需要枚举也称长度为n的即可 | |||||
数位dp
题目链接 | 题意描述 | 题目总结 | c++题解 | python3题解 | Java题解 | 自己的代码 |
---|---|---|---|---|---|---|
P2657 windy 数 | 在 [ a , b ] [a,b] [a,b]之间,不含前导零且相邻两个数字之差至少为 2的正整数 | |||||
P2602数字计数 | 在 [ a , b ] [a,b] [a,b]中的所有整数中,每个数码(digit)各出现了多少次 | |||||
1082. 数字游戏 | 在 [ a , b ] [a,b] [a,b]中的所有整数中,满足从左到右各位数字成小于等于的关系 | |||||
1084. 数字游戏 II | 在 [ a , b ] [a,b] [a,b]中的所有整数中,求区间内各位数字和 m o d mod mod N N N为 0的数的个数 | |||||
1085. 不要62 | 在 [ a , b ] [a,b] [a,b]中的所有整数中,求含有 4 或 62 的数的个数 | |||||
1086. 恨7不成妻 | 在 [ a , b ] [a,b] [a,b]中的所有整数中,整数中某一位是 7;整数的每一位加起来的和是 7 的整数倍;这个整数是 7 的整数倍,为和7有关的数。求和7有关的数的平方和 | AcWing 1086. 恨7不成妻 | ||||
树型dp
题目链接 | 题意描述 | 题目总结 | c++题解 | python3题解 | Java题解 | 自己的代码 |
---|---|---|---|---|---|---|
337. 打家劫舍 III | 在树上打劫,且不能连续打劫相邻的房子,求最大价值 | |||||
285. 没有上司的舞会 - AcWing题库 | 树中的点,树的每一条边的两端,至多选一个点,求有点覆盖的所有边权和最大的方案,求最大值 | |||||
323. 战略游戏 - AcWing题库 | 树的每一条边的两端,至少选择一个端点,使得所有边能被覆盖,求选择点数的最小值 | |||||
Acwing323. 战略游戏 | 树中每个点安排守卫都有不同的花费。在树中尽可能少代价,使得树中的每一个点都能被观测到 | |||||
Acwing1072树的最长路径 | 求树中的一条最长路径 | 找到从树上的某点到叶子节点的两条最长边相加 | ||||
dp处理字符串问题
题目链接 | 题意描述 | 题目总结 | c++题解 | python3题解 | Java题解 | 自己的代码 |
---|---|---|---|---|---|---|
45. 跳跃游戏 II | ||||||
10. 正则表达式匹配 | ||||||
数学中的dp问题
题目链接 | 题意描述 | 题目总结 | c++题解 | python3题解 | Java题解 | 自己的代码 |
---|---|---|---|---|---|---|
4009. 收集卡牌 - AcWing题库 | dp在求数学期望中的应用 | |||||
885. 求组合数 I - AcWing题库 | dp求组合数,利用了组合数的性质 | |||||
其他dp问题
题目链接 | 题意描述 | 题目总结 | c++题解 | python3题解 | Java题解 | 自己的代码 |
---|---|---|---|---|---|---|
1214. 波动数列 - AcWing题库 | 通过推导数学公式,利用余数的性质进行状态转移 | AcWing 1214. 波动数列 - AcWing(注意证明过程) 蓝桥杯 波动数列 01背包 | ||||
搜索
bfs(最短路)和dfs迷宫模型
题目链接 | 题意描述 | 题目总结 | c++题解 | python3题解 | Java题解 | 自己的代码 |
---|---|---|---|---|---|---|
3230. 游戏 - AcWing题库 | 障碍物只在特定时间段存在 | dis数组多维护一个时间维,存点信息用结构体 | ||||
3200. 无线网络 - AcWing题库 | 路由器有一个信号范围,给出可放路由器的位置,求至少选多少个路由器可以让网络连通 | 点的个数少坐标范围大,用邻接表存图 | ||||
3255. 行车路线 - AcWing题库 | 有2种路,走大路和小路的疲劳值不同,问在走最短路的情况下的最小疲劳值 | 发现点数少,小路最多只有1000条, d i s [ i ] [ j ] dis[i][j] dis[i][j]表示从起点走到i,且最后一段小路长是j的疲惫值; | ||||
AcWing 1112. 迷宫) | 普通的迷宫问题,注意dfs写法只能知道两个点之间是否联通 | |||||
1113. 红与黑 - AcWing题库 | 地上只有红与黑两种颜色的砖,每次只能向黑砖移动,问多少黑砖可达 | |||||
AcWing 1116. 马走日 | 嘛在棋盘上以“日”子跳,问算马可以有多少途径遍历棋盘上的所有点 | 注意方向数组的写法,用dfs维护的步数是全局变量;要回溯,同一点有多种跳法,可能会用多次 | ||||
NOIP2000单词接龙 | 给一组单词,问接龙后的串的最大长度是多少 | 维护一个 g [ i ] [ j ] g[i][j] g[i][j],表示,单词i和j之间的重合长度是多少 | ||||
给定 n n n个正整数,将它们分组,使得每组中任意两个数互质,至少要分成多少个组? | ||||||
bfs和dfs连通块模型(Flood Fill)
题目链接 | 题意描述 | 题目总结 | c++题解 | python3题解 | Java题解 | 自己的代码 |
---|---|---|---|---|---|---|
AcWing 1097. 池塘计数 | 求矩阵中连通块的数量(8连通) | Flood Fill是维护一个st矩阵,在主函数中,一遇到水就开始搜。只有一个点周围全是水的时候才继续往下搜,每搜到一个符合条件的点,就在st数组中标记一下。每次搜完就搜到一个完整的连通块,进行计数 | AcWing 1097. 池塘计数 - AcWing | LakeCounting.cpp | ||
Acwing1106山峰和山谷 | 求矩阵中最高点和最底点的数量(相对应每个点 以上是关于算法刷题总结的主要内容,如果未能解决你的问题,请参考以下文章 |