结合B站大佬视频学习,整理了一份洛谷黄题及以上难度的精选题单,分享给有同样需求的你。
0 - 模拟
【模拟】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P2867 Big Square]] |
普及+ |
⭐⭐⭐ |
枚举对角线 + 几何推导 |
枚举任意两头J牛作为对角线端点,利用中点和向量旋转推导另外两个顶点,验证整数坐标、边界和障碍后更新最大面积,时间复杂度 \(O(J^2)\),空间复杂度 \(O(N^2)\) |
A - 基础算法
【整数二分】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P2440 木材加工]] |
普及 |
⭐⭐ |
整数二分 |
在切割长度域上二分查找,通过 \(\sum \lfloor L_i/mid \rfloor \geq k\) 判定可行性,最终 \(r\) 即为最大可行长度,时间复杂度 \(O(n \log \max(L_i))\),空间复杂度 \(O(n)\) |
| 洛谷 |
[[P2678 跳石头]] |
普及 |
⭐⭐⭐ |
整数二分 + 贪心验证 |
二分最短跳跃距离,验证时贪心移走间距不足的岩石,判断移走数量是否不超过M,时间复杂度 \(O(N \log L)\),空间复杂度 \(O(N)\) |
| 洛谷 |
[[P3853 路标设置]] |
普及 |
⭐⭐⭐ |
整数二分 + 贪心验证 |
二分空旷指数,验证时每段间距贪心计算需要增设的路标数,判断总数是否不超过K,时间复杂度 \(O(N \log L)\),空间复杂度 \(O(N)\) |
【贪心】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[B3872 巧夺大奖]] |
普及 |
⭐⭐⭐ |
贪心排序 + 时间槽分配 |
按奖励降序排序,每个任务从截止时间向前找第一个空闲时间段安排,累加奖励,时间复杂度 \(O(n^2)\),空间复杂度 \(O(n)\) |
| 洛谷 |
[[B3930 烹饪问题]] |
普及 |
⭐⭐ |
降序排序 + 贪心剪枝 |
数组降序排序后,外层枚举时若当前元素不大于当前最大值则剪枝,内层与后续元素求与更新最大值,时间复杂度 \(O(N^2)\)(剪枝优化后接近 \(O(N\log N)\)),空间复杂度 \(O(N)\) |
| 洛谷 |
[[B4071 武器强化]] |
普及 |
⭐⭐⭐⭐ |
枚举目标票数 + 贪心压制 |
枚举武器1的目标票数 \(x\),对其他武器贪心拿走最便宜的票使其票数 \(< x\),不足时从剩余票池补最便宜的,取所有 \(x\) 的最小花费,时间复杂度 \(O(m^2 \log m)\),空间复杂度 \(O(m)\) |
| 洛谷 |
[[P1090 合并果子]] |
普及 |
⭐⭐⭐ |
哈夫曼贪心 + 小根堆 |
每次从小根堆取出最小的两堆合并,新堆入堆,累加合并代价直至剩一堆,时间复杂度 \(O(n \log n)\),空间复杂度 \(O(n)\) |
| 洛谷 |
[[P1106 删数问题]] |
普及 |
⭐⭐⭐ |
贪心范围查找 |
每次在可删除范围\([mark, k+i]\)内找最小数字作为当前位,更新起始位置,跳过前导零,时间复杂度\(O(n^2)\),空间复杂度\(O(n)\) |
| 洛谷 |
[[P1167 刷题]] |
普及 |
⭐⭐ |
时间转换 + 贪心排序 |
将日期时间转换为总分钟数计算可用时间,题目按耗时升序排序后贪心选取,时间复杂度 \(O(N \log N)\),空间复杂度 \(O(N)\) |
| 洛谷 |
[[P1209 修理牛棚]] |
普及 |
⭐⭐ |
贪心 + 排序 |
将牛棚排序后计算相邻牛之间的空隙,用一块木板全覆盖所有牛再减去最大的\(m-1\)个空隙长度得到最小总长度,时间复杂度\(O(c \log c)\),空间复杂度\(O(c)\) |
| 洛谷 |
[[P1969 积木大赛]] |
普及 |
⭐⭐ |
贪心差分 |
从左到右遍历,每个上升段 \(h_i > h_{i-1}\) 需要额外 \(h_i-h_{i-1}\) 次区间操作,累加所有上升差分即为答案,时间复杂度 \(O(n)\),空间复杂度 \(O(n)\) |
| 洛谷 |
[[P5019 铺设道路]] |
普及 |
⭐⭐ |
贪心差分 |
从左到右遍历,每个上升段 \(d_i > d_{i-1}\) 需要额外 \(d_i-d_{i-1}\) 天区间操作,累加所有上升差分即为答案,时间复杂度 \(O(n)\),空间复杂度 \(O(n)\) |
| 洛谷 |
[[P11960 平均分配]] |
普及 |
⭐⭐ |
排序 + 贪心分配 |
按 \(b_i - c_i\) 降序排序,前 \(n\) 件分配给 B、后 \(n\) 件分配给 C,最大化总收入,时间复杂度 \(O(n \log n)\),空间复杂度 \(O(n)\) |
| 洛谷 |
[[P15256 Purchasing Milk]] |
普及 |
⭐⭐⭐⭐ |
贪心 + 二进制分解 + 价格预处理 |
预处理价格使 \(a_i = \min(a_i, 2 \cdot a_{i-1})\) 保证合理性,并记录 \(i \geq 32\) 时的最低价格作为保底;对每个查询 \(x\),从大到小枚举前31个交易(\(base = 2^{i-1}\)),贪心购买 \(x/base\) 个当前交易,计算候选答案(有余数则多买一个),同时更新剩余需求 \(x \%= base\),最终输出最小花费,单次查询 \(O(\log x)\)。 |
【反悔贪心】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P14635 糖果店]] |
普及 |
⭐⭐⭐⭐ |
反悔贪心 + 周期成本分析 |
按\(x_i\)排序后枚举前\(i\)种糖果各买第一颗,剩余预算用最小周期成本\(min(x_i+y_i)\)反复购买,取所有枚举的最大值,时间复杂度\(O(n\log n)\),空间复杂度\(O(n)\) |
【递推】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P1113 杂务]] |
普及 |
⭐⭐ |
递推 / 拓扑序 DP |
利用输入顺序即拓扑序,递推计算每个杂务的最早完成时间 \(thing[k] = len_k + \max\{thing[pre]\}\),全局取最大得答案,时间复杂度 \(O(n \times m)\),空间复杂度 \(O(n)\) |
B - 搜索
【DFS-一维】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P1034 矩形覆盖]] |
普及+ |
⭐⭐⭐⭐ |
DFS + 剪枝 + 回溯 |
DFS枚举每个点归属k个矩形之一,动态维护矩形边界和面积,当前面积≥最优解时剪枝,叶子节点检查矩形互不重叠,时间复杂度\(O(k^n \cdot k^2)\),空间复杂度\(O(k)\) |
【DFS-二维】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P1219 八皇后]] |
普及 |
⭐⭐⭐ |
DFS回溯 + 对角线标记 |
逐行DFS放置皇后,用三个数组\(O(1)\)标记列和两条对角线冲突,回溯恢复状态,输出前3个解和总数,时间复杂度\(O(n!)\),空间复杂度\(O(n)\) |
【BFS-二维】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P1747 好奇怪的游戏]] |
普及 |
⭐⭐ |
BFS(12方向扩展) |
将"日"字和"田"字走法统一为12个方向向量,两次独立BFS分别求两匹马到 \((1,1)\) 的最少步数,时间复杂度 \(O(XY)\),空间复杂度 \(O(XY)\) |
| 洛谷 |
[[P2895 流星雨]] |
普及 |
⭐⭐⭐ |
时间约束 BFS |
预处理每个格子的最早危险时间,BFS扩展时检查到达时间严格小于危险时间,首次到达安全格即输出,时间复杂度 \(O(M+XY)\),空间复杂度 \(O(XY)\) |
| 洛谷 |
[[P8628 穿越雷区]] |
普及 |
⭐⭐⭐ |
状态扩展 BFS(三维状态) |
用三维状态 dist[x][y][last] 表示到达 \((x,y)\) 且上一步经过的格子类型为 last(0 表示 +,1 表示 -)的最短距离;从起点 \(A\) 出发向四个方向初始化,若邻居是 + 则 dist[nx][ny][0]=1 入队,若是 - 则 dist[nx][ny][1]=1 入队;BFS 扩展时 need = 1-last 表示下一步需要的格子类型,只有当邻居是 need 对应的类型或为终点 \(B\) 时才可转移,更新 nlast 后入队;最终答案取 dist[edx][edy][0] 和 dist[edx][edy][1] 的最小值,若均不可达输出 -1;时间复杂度 \(O(n^2)\)。 |
| 洛谷 |
[[P1849 Tractor]] |
普及+ |
⭐⭐⭐ |
01-BFS(双端队列最短路) |
将经过干草堆建模为边权1、普通移动为边权0,用双端队列BFS求从起点到原点的最小代价路径,时间复杂度 \(O(XY)\),空间复杂度 \(O(XY)\) |
| 洛谷 |
[[P2845 Switching on the Lights]] |
普及+ |
⭐⭐⭐ |
BFS + 动态点亮 |
从(1,1)开始BFS,到达每个房间时点亮其开关控制的灯,若新点亮的灯与已访问区域相邻则加入队列继续探索,统计最终亮灯数,时间复杂度 \(O(N^2+M)\),空间复杂度 \(O(N^2+M)\) |
| 洛谷 |
[[P2919 Guarding the Farm]] |
普及+ |
⭐⭐⭐ |
BFS 连通块 + 极值判断 |
对每个未访问格子BFS找八连通等高连通块,过程中检查八邻域是否存在更高点,若无则是山顶,时间复杂度 \(O(NM)\),空间复杂度 \(O(NM)\) |
| 洛谷 |
[[P3663 Why Did the Cow Cross the Road III]] |
普及+ |
⭐⭐⭐ |
BFS连通块 + 补集组合计数 |
用BFS找不经过道路的所有连通块,统计每块内奶牛数,总对数减去各块内对数即为远距离对数,时间复杂度 \(O(N^2+K)\),空间复杂度 \(O(N^2)\) |
| 洛谷 |
[[P5195 Knights of Ni]] |
普及+ |
⭐⭐⭐ |
两次 BFS(多源 BFS) |
第一次 BFS 从起点出发,计算 dist1(不能经过骑士位置 3);第二次多源 BFS 从所有骑士位置同时出发,计算 dist2(可以经过任何可通行区域);遍历所有灌木位置 4,取 dist1[r][c] + dist2[r][c] 的最小值作为答案(即起点→灌木→骑士的最短路径);两次 BFS 时间复杂度均为 \(O(W \times H)\)。 |
C - 数据结构
【单调队列】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P11963 环线]] |
普及 |
⭐⭐⭐ |
单调队列 |
将环形数组复制一倍,前缀和后用单调队列维护长度不超过 \(n\) 的滑动窗口最小值,\(maxn = \max(sa[i] - sa[q[hh]])\),时间复杂度 \(O(n)\),空间复杂度 \(O(n)\) |
【栈】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P1503 鬼子进村]] |
普及+ |
⭐⭐⭐ |
区间边界维护 + 栈 |
用 l[i]/r[i] 维护每个房子所在连续段边界,栈记录摧毁顺序,D 分裂区间、R 合并区间、Q 直接输出区间长度,时间复杂度 \(O(mn)\),空间复杂度 \(O(n)\) |
【并查集】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P1892 团伙]] |
普及+ |
⭐⭐⭐ |
并查集 + 虚拟节点 |
用 \(i+n\) 表示 \(i\) 的虚拟仇人,敌人关系转化为与虚拟节点合并,朋友关系直接合并,最后统计前 \(n\) 个节点的连通分量数,时间复杂度 \(O((n+m)\alpha(n))\),空间复杂度 \(O(n)\) |
【哈希表】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P3021 Bovine Bridge Battle]] |
普及 |
⭐⭐⭐ |
中点哈希 + 组合计数 |
枚举所有点对计算中点坐标的两倍并用map统计,每个出现\(cnt\)次的中点贡献\(\binom{cnt}{2}\)个合法四点组,时间复杂度\(O(N^2\log N)\),空间复杂度\(O(N^2)\) |
D - 图论
【DFS-树】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P11249 小杨寻宝]] |
普及 |
⭐⭐⭐ |
树形DFS + 贪心约束验证 |
自底向上统计子树宝物分支数,根节点最多2个、非根节点最多1个需要访问的子分支,违反则输出No,时间复杂度 \(O(tn)\),空间复杂度 \(O(n)\) |
| 洛谷 |
[[P14919 路径覆盖]] |
普及 |
⭐⭐⭐ |
树形DP(后序遍历) |
自底向上DFS,每个节点取min(自身染黑代价, 所有子树最小代价之和),叶子节点保持自身代价,输出根节点值,时间复杂度 \(O(n)\),空间复杂度 \(O(n)\) |
| 洛谷 |
[[P15801 完全二叉树]] |
普及 |
⭐⭐⭐⭐ |
DFS-树 / 递归判定 |
后序遍历每个节点,维护子树节点数 cnt、深度 dep、是否完全二叉树 flag,当前节点为完全二叉树当且仅当左右子树均为完全二叉树且满足"深度相等+左满"或"左深1+右满",时间复杂度 \(O(n)\),空间复杂度 \(O(n)\) |
【DFS-图】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P1394 山上的国度]] |
普及 |
⭐⭐ |
DFS-图 |
枚举每个村庄作为水库起点,DFS 中仅允许从海拔高的村庄流向海拔低的村庄,判断能否覆盖全部 \(n\) 个村庄,时间复杂度 \(O(n(n+m))\),空间复杂度 \(O(n+m)\) |
| 洛谷 |
[[P6066 Watchcow]] |
普及+ |
⭐⭐⭐ |
DFS 欧拉回路(Hierholzer) |
将无向边拆为两条有向边,DFS遍历每条有向边恰好一次(访问后标记删除),回溯时记录节点得到欧拉回路,时间复杂度 \(O(N+M)\),空间复杂度 \(O(N+M)\) |
【BFS-图】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P11280 Jom & Terry]] |
普及 |
⭐⭐ |
BFS(无权图最短距离) + 博弈论分析 |
从根节点 \(r\) 出发 BFS 计算每个节点到根的最短距离 dist[i];博弈分析发现 Terry 能到达根的条件是 dist[a] <= dist[b](Terry 到根的距离不超过 Jom 到根的距离),因为 Terry 先手且双方每回合最多走一步,距离更近的一方可以先到达目标;每次查询 \(O(1)\) 比较距离输出 Terry 或 Jom;先输出 I'm here!,BFS 时间复杂度 \(O(n+m)\),总时间复杂度 \(O(n+m+q)\)。 |
| 洛谷 |
[[P14921 城市规划]] |
普及 |
⭐⭐⭐ |
全源BFS求图中心 |
对每个节点运行BFS计算其到最远节点的距离(偏心距),取偏心距最小的节点作为图中心,时间复杂度 \(O(n(n+m))\),空间复杂度 \(O(n+m)\) |
| 洛谷 |
[[P1144 最短路计数]] |
普及+ |
⭐⭐⭐ |
BFS最短路计数 |
无权图BFS按层扩展,首次访问节点时继承路径数,同层再次访问时累加路径数,输出对100003取模,时间复杂度 \(O(N+M)\),空间复杂度 \(O(N+M)\) |
| 洛谷 |
[[P5543 The Great Revegetation]] |
普及+ |
⭐⭐⭐ |
BFS 扩展染色(二分图 + 带权并查集思想) |
用两个邻接表 s(相同关系)和 d(不同关系)分别存储约束,对每个未访问节点启动 BFS:相同关系邻居染同色(color[v] = color[u]),不同关系邻居染异色(color[v] = -color[u]),若出现矛盾(相同关系颜色不同或不同关系颜色相同)则输出 0;每个连通分量独立,有 \(2\) 种染色方案,总方案数为 \(2^{\text{连通分量数}}\),二进制表示为 1 后跟连通分量数个 0;时间复杂度 \(O(N+M)\)。 |
【Floyd】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P1744 采购特价商品]] |
普及 |
⭐⭐ |
Floyd |
用 Floyd-Warshall 三重循环松弛所有点对最短距离,边权为欧几里得距离,最终输出 \(dp[s][t]\) 保留两位小数,时间复杂度 \(O(n^3)\),空间复杂度 \(O(n^2)\) |
| 洛谷 |
[[P2419 Cow Contest]] |
普及 |
⭐⭐⭐ |
Floyd-Warshall 传递闭包 |
将比赛结果建模为有向图,Floyd计算传递闭包后,统计与其他\(N-1\)头都有确定强弱关系的奶牛数量,时间复杂度 \(O(N^3)\),空间复杂度 \(O(N^2)\) |
【SPFA】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P1346 电车]] |
普及 |
⭐⭐⭐ |
SPFA |
将默认轨道建模为边权 \(0\)、非默认轨道建模为边权 \(1\),用 SPFA 求从 \(A\) 到 \(B\) 的最短路径(最少切换次数),时间复杂度 \(O(k \cdot E)\),空间复杂度 \(O(N + E)\) |
| 洛谷 |
[[P2850 Wormholes]] |
普及 |
⭐⭐⭐ |
SPFA 负环检测 |
将双向路径建为正权边、虫洞建为负权边,SPFA全源初始化检测负环(入队次数≥N),存在负环则输出YES,时间复杂度 \(O(F \cdot NM)\),空间复杂度 \(O(N+M+W)\) |
| 洛谷 |
[[P2226 遥控赛车比赛]] |
普及+ |
⭐⭐⭐⭐ |
分层图最短路 / SPFA |
将连续直走长度纳入状态维度,用 SPFA 在 \((x, y, dir, len)\) 四维状态上求最短路,仅当 \(len \geq t\) 时允许转弯,枚举 \(t \in [1,10]\) 分别求解,时间复杂度 \(O(10 \times N \times M \times 40)\),空间复杂度 \(O(N \times M \times 40)\) |
【生成树】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P2820 局域网]] |
普及 |
⭐⭐ |
Kruskal 最小生成树 + 补集转化 |
总权重减去最小生成树权重即为可删除的最大权重和,用Kruskal+并查集求最小生成树,时间复杂度 \(O(m \log m)\),空间复杂度 \(O(n+m)\) |
【最近公共祖先】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P2971 Cow Politics]] |
普及+ |
⭐⭐⭐⭐ |
树直径 + LCA 倍增 |
BFS预处理深度和倍增数组,找到每种颜色最深节点作为直径端点,遍历同色节点用LCA求最大距离即为该颜色范围,时间复杂度 \(O(n \log n)\),空间复杂度 \(O(n \log n)\) |
| 洛谷 |
[[P3398 仓鼠找 sugar]] |
普及+ |
⭐⭐⭐ |
LCA倍增 + 路径相交判定 |
预处理深度和倍增数组,每次询问用LCA计算4组距离,通过\(ab+cd \geq \max(ac+bd, ad+bc)\)判定路径是否相交,时间复杂度 \(O((n+q)\log n)\),空间复杂度 \(O(n\log n)\) |
【二分图】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P1330 封锁阳光大学]] |
普及 |
⭐⭐⭐ |
二分图判定(染色法)/ 贪心 |
对每个未染色的连通块 DFS 染色并统计两种颜色的数量 \(cnt[1]\) 和 \(cnt[2]\),若发现相邻节点同色则存在奇环输出 Impossible,否则每个连通块选择 \(\min(cnt[1], cnt[2])\) 累加即为最少河蟹数,孤立点无需河蟹直接跳过。 |
| 洛谷 |
[[P14552 乌拉尔冰球赛]] |
普及 |
⭐⭐⭐ |
二分图染色 / 独立集 |
将每场比赛视为无向边构建图(每个节点度数为2,图由若干环组成,必为二分图),DFS 染色后将所有红色节点存入 ans,若 ans.size() >= K 则输出前 \(K\) 个红色节点(同色集合内节点互不相邻,构成独立集),否则输出 \(0\)。 |
E - 动态规划
【线性DP-一维】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[B4163 序列选择]] |
普及 |
⭐⭐ |
线性 DP |
设 \(f[i][0/1]\) 为第 \(i\) 位选 \(a_i\)/\(b_i\) 的最小代价,四种转移取最小:\(f[i][0]=\min(f[i-1][0]+|a_i-a_{i-1}|, f[i-1][1]+|a_i-b_{i-1}|)\),时间复杂度 \(O(n)\),空间复杂度 \(O(n)\) |
| 洛谷 |
[[P2690 Apple Catching]] |
普及 |
⭐⭐⭐ |
线性 DP |
设 \(f[i][j][k]\) 为前 \(i\) 分钟移动 \(j\) 次后在树 \(k+1\) 下接到的最多苹果数,每分钟转移考虑"不动"或"从另一棵树移来"两种情况取最大值,时间复杂度 \(O(T \times W)\),空间复杂度 \(O(T \times W)\) |
| 洛谷 |
[[P3842 线段]] |
普及 |
⭐⭐⭐ |
线性 DP |
设 \(f[i][0/1]\) 为处理完前 \(i\) 行停在左/右端点的最短距离,利用 \(F(a,b,c)=|a-b|+|b-c|\) 计算跨行转移,虚拟终点行统一处理,时间复杂度 \(O(n)\),空间复杂度 \(O(n)\) |
| 洛谷 |
[[P14075 划分字符串]] |
普及 |
⭐⭐⭐ |
线性 DP |
设 \(dp[i]\) 为前 \(i\) 个字符的最大价值,枚举以 \(i\) 结尾的无重复字符子串起点 \(j\),用集合判重确保合法,转移 \(dp[i] = \max(dp[i], dp[j-1] + a_{i-j+1})\),时间复杂度 \(O(n^2)\),空间复杂度 \(O(n)\) |
| 洛谷 |
[[P1353 Running]] |
普及+ |
⭐⭐⭐⭐ |
线性DP-二维(带状态跳跃) |
\(f[i][j]\) 表示第 \(i\) 分钟疲劳度为 \(j\) 时的最大跑步距离,跑步则 \(f[i+1][j+1] = \max(f[i+1][j+1],\, f[i][j] + d_{i+1})\)(\(j < m\)),休息且 \(j=0\) 则 \(f[i+1][0] = \max(f[i+1][0],\, f[i][0])\),休息且 \(j>0\) 则直接跳跃 \(j\) 分钟恢复 \(f[i+j][0] = \max(f[i+j][0],\, f[i][j])\),答案为 \(f[n][0]\)。 |
| 洛谷 |
[[P2098 Team Building]] |
普及+ |
⭐⭐⭐⭐ |
线性DP-三维(容斥计数) |
\(dp[i][j][k]\) 表示从 FJ 前 \(i\) 头(降序)和 FP 前 \(j\) 头(降序)中选 \(k\) 对且 FJ 每对都获胜的方案数,容斥转移 \(dp[i][j][k] = dp[i-1][j][k] + dp[i][j-1][k] - dp[i-1][j-1][k]\),若 \(a_i > b_j\) 则额外加上 \(dp[i-1][j-1][k-1]\),答案为 \(dp[n][m][K]\)。 |
| 洛谷 |
[[P2233 公交车路线]] |
普及+ |
⭐⭐⭐ |
线性 DP |
设 \(f[i][j]\) 为换乘 \(i\) 次后到达 \(j\) 站的方案数,从左右邻站转移但禁止从 E 站(编号 \(4\))出发,滚动数组优化空间,时间复杂度 \(O(n)\),空间复杂度 \(O(1)\) |
【线性DP-二维】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P2701 巨大的牛棚]] |
普及 |
⭐⭐⭐ |
二维 DP |
设 \(dp[i][j]\) 为以 \((i,j)\) 为右下角的最大无树正方形边长,状态转移取上方、左方、左上方最小值加 \(1\),全局取最大得答案,时间复杂度 \(O(n^2)\),空间复杂度 \(O(n^2)\) |
【01背包】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[B4177 尽量接近]] |
普及 |
⭐⭐⭐ |
01 背包(布尔型) |
用布尔 DP \(f[i][j]\) 判定前 \(i\) 个数能否凑出和 \(j\),遍历所有可达和找与 \(K\) 差值最小者(平局取小),时间复杂度 \(O(N \times sum)\),空间复杂度 \(O(N \times sum)\) |
| 洛谷 |
[[P2340 Cow Exhibition]] |
普及 |
⭐⭐⭐⭐ |
背包DP-01背包(偏移量处理负数) |
\(dp[j]\) 表示智商之和为 \(j - \text{OFFSET}\) 时情商之和的最大值,枚举每头奶牛做01背包转移 \(dp[j] = \max(dp[j],\, dp[j-s_i] + f_i)\),最后遍历 \(j \geq \text{OFFSET}\) 且 \(dp[j] \geq 0\) 的状态,取 \(\max((j-\text{OFFSET}) + dp[j])\)。 |
| 洛谷 |
[[P13018 调味平衡]] |
普及 |
⭐⭐⭐ |
背包DP-01背包(差值转换+偏移量) |
将每种食材转化为差值 \(d_i = a_i - b_i\) 和和值 \(s_i = a_i + b_i\),\(dp[j]\) 表示差值为 \(j - \text{OFFSET}\) 时的最大和值,转移 \(dp[j] = \max(dp[j],\, dp[j-d_i] + s_i)\),答案为 \(dp[\text{OFFSET}]\)。 |
| 洛谷 |
[[P14920 道具商店]] |
普及 |
⭐⭐⭐ |
01 背包(逆向 DP) |
设 \(dp[j]\) 为获得 \(j\) 点攻击力的最小金币数,倒序 01 背包更新后枚举满足 \(dp[j] \leq k\) 的最大 \(j\),时间复杂度 \(O(n \times \sum a_i)\),空间复杂度 \(O(\sum a_i)\) |
【完全背包】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P1474 Cow Cash]] |
普及 |
⭐⭐ |
背包DP-完全背包(计数型) |
\(dp[j]\) 表示组成金额 \(j\) 的方案数,外层遍历每种货币 \(i\),内层正向枚举金额 \(j\) 从 \(a_i\) 到 \(N\) 转移 \(dp[j] \mathrel{+}= dp[j-a_i]\),初始化 \(dp[0]=1\),答案为 \(dp[N]\)。 |
| 洛谷 |
[[P3027 Making Money]] |
普及 |
⭐⭐⭐ |
完全背包(逆向状态定义) |
以剩余资金为状态维度,倒序遍历实现无限选取,\(f[j]\) 记录剩余 \(j\) 时的最大额外利润,最终答案为 \(\max(j + f[j])\),时间复杂度 \(O(NM)\),空间复杂度 \(O(M)\) |
|
|
|
|
|
|
【树形DP】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[B4016 树的直径]] |
普及 |
⭐⭐ |
两次DFS / BFS(树形DP思想) |
基于树的直径性质:从树上任意一点出发 DFS/BFS 找到的最远节点,一定是直径的一个端点;因此第一次从任意节点(如 1)出发找到最远节点 \(t\),第二次从 \(t\) 出发找到的最远距离即为树的直径,时间复杂度 \(O(n)\)。 |
| 洛谷 |
[[P1670 Tree Cutting]] |
普及 |
⭐⭐⭐ |
树形DP求重心 |
两次DFS:第一次后序计算子树大小,第二次计算删除该节点后的最大连通块大小,若不超过\(n/2\)则为重心,时间复杂度 \(O(N)\),空间复杂度 \(O(N)\) |
| 洛谷 |
[[P11378 燃烧]] |
普及 |
⭐⭐⭐ |
树形DP + 记忆化搜索 |
以每个节点为起点记忆化DFS,向权值严格小于自身的邻居扩散,累加可燃烧节点数,枚举所有起点取最大值,时间复杂度 \(O(n)\),空间复杂度 \(O(n)\) |
| 洛谷 |
[[P5536 核心城市]] |
普及+ |
⭐⭐⭐⭐ |
树直径 + 三次DFS + 贪心排序 |
两次DFS找直径端点,记录路径取中点为根,第三次DFS计算各子树高度,降序排序后输出第\(k+1\)大的值作为最小交通拥堵度,时间复杂度 \(O(n \log n)\),空间复杂度 \(O(n)\) |
【树上背包】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P1273 有线电视网]] |
普及+ |
⭐⭐⭐⭐⭐ |
树上背包(树形DP) |
定义 f[u][i] 为以 \(u\) 为根的子树选 \(i\) 个用户的最大净收益(用户付费减去传输费用),对每棵子树做背包合并(倒序枚举容量、枚举子树选取用户数),叶子节点初始化 f[i][1]=p[i],最终从大到小找 f[1][i] >= 0 的最大 \(i\),时间复杂度 \(O(N \cdot M^2)\)。 |
G - 数学
【数学】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[P14974 Chip Exchange]] |
普及 |
⭐⭐⭐ |
数学分类讨论 |
先用现有B换A,按\(c_A \geq c_B\)或\(c_A < c_B\)分类讨论最坏情况,计算补足A缺口和B转换缺口的最小\(x\),时间复杂度\(O(T)\),空间复杂度\(O(1)\) |
【质数】
| 题目来源 |
标题 |
难度 |
星级 |
考察算法 |
一句话思路总结 |
| 洛谷 |
[[B4050 挑战怪物]] |
普及 |
⭐⭐ |
贪心 + 埃氏筛质数判定 |
优先使用递增物理攻击降低血量,当血量恰好为质数时用魔法攻击一击清零,无法恰好清零则输出-1,时间复杂度 \(O(MAX \log\log MAX + t\log h)\),空间复杂度 \(O(MAX)\) |
| 洛谷 |
[[P14918 相等序列]] |
普及 |
⭐⭐⭐ |
质因数分解 + 频率统计贪心 |
埃氏筛预处理后对每个数分解质因数,统计每个质数各指数出现频率,对每对(质数,指数)贪心选择多数方向统一,时间复杂度 \(O(MAX\log\log MAX + N\sqrt{A_{\max}})\),空间复杂度 \(O(MAX)\) |