OI知识点总结(不拿S 250分不改此名)

CSP复赛应考策略

一、J组

1.目标分数:320分

具体构成:

  • 方案一:100+100+100+20

  • 方案二:100+100+60+60

  • 方案三:100+100+80+40

    后两题平衡120分+

2.时间分配

8:30~8:40 通读题面

8:40~9:00 T1

9:00~9:40左右 T2(对拍)

9:40~10:30 T3

10:30~11:50 调试题目以及暴力

11:50~12:00 检查

二、S组

1.目标分数:200+分

具体构成:

  • 按照难度由简到难,方案一:100+60+20+20

  • 方案二:100+40+40+20

2.时间分配(按题目难度重新排序):

2:30~2:50 通读体面(确定思路方向,思考准确后再打代码,提前整理思路)

2:50~3:50 T1正解+对拍程序

3:50~5:30 从暴力难度和分数平衡后由简到难拿部分分,平均每道题分配30分钟的暴力时间,时间一到强行跳过

5:30~6:20 调试代码

6:20~6:30 检查代码

三、高难度情况应对方案

  1. 心理状态调整(稳住别慌)
  2. 以部分分为主,不贪图正解

四、做题优先级

  1. 简单且有信心实现
    • 确保不丢分,避免低级失误
    • 尽量快速 A 掉,不浪费时间
  2. 难但有信心实现
    • 先理清楚思路细节,不要盲目下手
    • 拆分、转化问题,向自己擅长的领域靠拢
  3. 简单没有信心实现
    • 想清楚实现细节,不要盲目下手
    • 重点关注数据范围,实时更新策略
  4. 难且没有信心实现
    • 快速完成暴力、空出时间给其他性价比高的题目

五、心态

1. 即使考砸也不用有心理负担,再练、再战

2. 战略上藐视它,战术上重视它

3. 我不会的很多人都不会

4. 我已经复习的非常全面了,正常发挥即可

5. 考试只有四道题,比拼的不是知识量,而是谁少犯错、失误

6. 步步为营(增强心理暗示的正反馈)

六、避坑指南

  1. 十年\(OI\)一场空,不开\(LongLong\)见祖宗
  2. 不要快速决策,先把题想清楚
  3. 代码也许是对的,错的也可能是思路
  4. 通过上厕所、吃东西等方式放松神经
  5. 代码检查项:文件名、时空大小 、注释、Linux下编译环境、输入输出格式、变量类型、多测清空

OI学习知识点总结

作者: By Rylanf
看不到也正常,这是私人 \(OJ\) 的主页。所以在下我也会列出作者以及帮助者的主页(洛谷上的)。

创作者

Rylanf

建设帮助

暂无

算法指导

暂无

感谢墙

暂无

前言:

这是一个 \(OI\) 学习者的算法以及技巧整理,希望有能够帮助到你的地方。这里会包括所有算法,不用担心没有你想要的,如果真的没有,那可以稍等一下,将来一定会有的。(其实是想让你点赞收藏,以后应该是用得到的)
下面的讲解我将会用红、蓝、黑三种颜色标注一些文段, 被红色标注 的代表:知识点、需要着重关注的点。 被蓝色标注 的代表:算法判断、对比判断、总结。

这里面的一些题目打不开是正常的,可以在洛谷上按照名字搜,以后都如此,故不再声明。当然,点进我的主页里,看我创建的题目也许能发现这些题~~~

这篇文章一直会更新,为了方便一些同学的阅读,所以我会在下面总结概括我的更新情况,具体如下:

更新情况:

2026/4/12

完成 \(\text{DP}\) 算法的部分总结,包括:

  1. \(\text{DP}\) 基础。
  2. 记忆化搜索以及状压 \(\text{DP}\)
  3. 背包 \(\text{DP}\)​ 。

2026/4/14

继续完成 \(\text{DP}\) 的总结,包括:

  1. 区间 \(\text{DP}\)

动态规划部分

算法简介

本章将介绍介绍动态规划(Dynamic Programming, DP)及其解决的问题、根据其设计的算法及优化.

动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法.

由于动态规划并不是某种具体的算法,而是一种解决特定问题的方法,因此它会出现在各式各样的数据结构中,与之相关的题目种类也更为繁杂.

在 OI 中,计数等非最优化问题的递推解法也常被不规范地称作 DP,因此本章将它们一并列出.事实上,动态规划与其它类型的递推的确有很多相似之处,学习时可以注意它们之间的异同.

动态规划基础

此主题主要讲述了动态规划的使用方法以及基本思想,其中还有状态定义的思路提示。

引入

一道题目

这是一道非常经典的 \(DP\) 题目,我们先来分析一下。

首先,不难想到一个贪心策略,每次从当前点前往这个点的下方、右方中点权较大的那个点。但是这不难看出应该是错误的,因为上面说的策略只能保证前面一段是较优的,但是到了后面可能会错过一些更优的选择。这就是动态规划与贪心的区别—— 贪心讲究步步最优解,全局最优解。而动态规划则是以局面为一个单位,保证每个局面是最优解的。

详细的来讲:设 \(f_{i,j}\) 表示为点 \((1,1)\) 到点 \((i,j)\) 能够获得的最大价值,假设现在已经得到点 \((i-1,j)\) 与点 \((i,j-1)\)\(f\) 值,那么有:
\(f_{i,j}=\max \{f_{i-1,j}, f_{i,j-1}\} + val_{i,j}\)
那这样做,我们就可以正确的计算出答案了: \(f_{n,m}\)

回顾一下:我们定义了一个局面——到点 \((i,j)\) 能获得的最大价值,如果观察这条最优路线,能发现一定不存在更优的一条路线使得到原路线其中的任意一个点的总收益更大。这就是具象化的 “局面最优解” 。那么这样有什么好处呢?主要分为一下几点:

  1. 成功的缩小了问题范围 。比如上述例题:我们把到点 \((n,m)\) 的最优路线分为了到点 \((n-1,m)\)\((n,m-1)\) 的最优路线加上点 \((n,m)\) 的点权。
  2. 因为在动态规划的计算下,每一个局面都是最优解,所以我们可以只用 \(n \times m\) 的时间复杂度解决点 \((1,1)\) 到点 \((i,j)\) 所能获得的最大收益。这对以后的 总状态一定,多次子问题询问 有着很大的帮助。

上面讲述了动态规划的一个 基本思路 。而下面要讲述的就是动态规划的特征了。

动态规划原理

能用动态规划解决的问题必须满足三个条件,缺一不可: 最优子结构、无后效性和重叠子问题 。这三点是用来判断动态规划的底层逻辑,如果一道题目三个条件都满足,那就可以用动态规划解决了。

接下来我们详细介绍一下三个条件。

最优子结构

注意

如果一道题满足最优子结构,那么它也有可能可以用贪心完成。

简单来说,最优子结构就是全局最优解由子问题最优解一并推来。如下有一个判断最优子结构以及寻找状态定义的方法(Some parts are from the "OI Wiki"):

  1. 证明问题最优解的第一个组成部分 是做出一个选择
  2. 对于一个给定问题,在其可能的第一步选择中,假定你已经知道哪种选择才会得到最优解.你现在并不关心这种选择具体是如何得到的,只是假定已经知道了这种选择;
  3. 给定可获得的最优解的选择后,确定这次选择会产生哪些子问题,以及如何最好地刻画子问题空间;
  4. 证明作为构成原问题最优解的组成部分 ,每个子问题的解就是它本身的最优解.方法是 反证法 ,考虑加入某个子问题的解不是其自身的最优解,那么就可以从原问题的解中用该子问题的最优解替换掉当前的非最优解,从而得到原问题的一个更优的解,从而与原问题最优解的假设矛盾.

子问题图中每个定点对应一个子问题,而需要考察的选择对应关联至子问题顶点的边。可以先把所有需要用到的信息放进局面中,最后再把冗余的信息删除,这样就得到了动态规划的基本定义。 总结: 先判断可用信息,再筛选冗余信息

无后效性

可以理解成一个 图论问题 ,把每个局面定义成一个点,把局面与局面之间的关系当成边(注意一定得是有向边),按照如上生成出来的图 如果是一个有向无环图 ,则原问题 满足无后效性
用更加简洁的话语表示就是: 已经求解的子问题,不会再受到后续决策的影响

重叠子问题

子问题重叠指的是一些 最优解的得出会用到许多相同的子问题
如果有大量的重叠子问题,我们可以用空间将这些子问题的解存储下来, 避免重复求解相同的子问题 ,从而提升效率。

做题思路

用动态规划可以解决的题目一般的 思维方式如下

  1. 将题目划分为若干个状态、局面或阶段,然后提取出每个局面的特征(或将他用参数描述出来,这称之为 “状态” );
  2. 寻找每一个状态可能的决策,或者是状态与状态之间转移的公式(用数学语言表达就是 “状态转移方程” );
  3. 按顺序求解每一个阶段的问题。

如果用图论的角度去理解,就是建出来了一个 "DAG"(有向无环图) ,然后在上面跑一个最短(长)路罢了。(当然并不是所有的动态规划题目都可以用图论的最短(长)路类比)

一些举一反三

一些简单且常用的模型: H1.5.1.1. 方格取数H1.5.1.3. 最长不下降序列

记忆化搜索

定义

抛去记忆化,他就是纯搜索,相信大家已经对其很熟悉了。记忆化搜索,望文生义,就是有记忆的搜索。在搜索中,我们可能会遇到许多重叠子问题,这时我们就需要用一个数组把这些子问题记录下来,当搜索重复遇到一个状态时我们搜索一次即可。 这也是处理重叠子问题的一种方式

正因为有记忆,所以我们能够证明且很好证明 每个状态只会计算一次 。综上,他也是一种 常见实现动态规划的方式

引入

[NOIP 2005 采药]([P1048 NOIP 2005 普及组] 采药 - 洛谷)

这道题目显然有一个朴素的 \(\text{DFS}\) 算法,\(\text{DFS}\)​ 包含三个参数:当前是第几个物品、剩余时间为多少、已经获得的价值。让后枚举当前物品选与不选,转移到相应的状态。

优化

但是这个算法的时间复杂度是指数级别的,所以我们需要考虑优化。考虑为什么这个算法会效率低下?因为 同种参数组合会经历多次 ,所以使用记忆化搜索才能让时间复杂度正确。(因为每一个局面我们只会经历一次)

Q:如何使用记忆化搜索优化搜索?

A:

步骤如下:

  1. 先把暴力搜索打出来
  2. 再使用一个记忆化数组把每个局面记录下来

或者还可以:

  1. 先推出状态转移方程
  2. \(\text{DFS}\) 实现出来
  3. 加上记忆化数组

记忆化搜索有一个优于递推版动态规划的地方: 面临的局面都是合法的 。所以接下来就是状态压缩 \(\text{DP}\)

状压 \(\text{DP}\)

posted @ 2026-04-12 11:30  Ryan_L_F  阅读(2)  评论(0)    收藏  举报