一个稳定、规范的代码模板,确实可以帮助学生在解题或比赛中节省时间,也能减少逻辑错误。
但如果学生只是把模板背下来,却不知道它什么时候能用、为什么能用、哪里容易错,那模板反而会变成一种“假会”。
课堂上我见过很多这样的情况:
学生看到题目里有“最短”,马上想套最短路;看到“最大值最小”,马上想二分答案;看到“选或不选”,马上想动态规划;看到树,就想 DFS;看到连通,就想并查集。
但真正比赛时,题目往往不会这么直白。
有的题看起来像二分,其实没有单调性;有的题看起来像贪心,其实需要动态规划;有的题看起来像搜索,其实数据范围要求剪枝或记忆化;有的题看起来可以用最短路,但建图方式才是真正难点。
所以,我不反对学生掌握模板,但我反对学生只背模板。
比如讲二分时,我不会只让学生背:
while(l<=r) { ...... }
我一定会追问:
为什么答案空间是有序的?单调性在哪里?check(mid) 判断的是什么?mid 可行时,应该移动左边界还是右边界?最后输出的是 l 还是 r?
这些问题回答不出来,说明他只是记住了外壳,还没有理解二分。
讲 DFS 时,我会问:
当前状态是什么?下一步有哪些选择?什么时候停止?是否需要回溯?有没有重复状态?搜索树大概有多大?
这些才是 DFS 真正要训练的内容。
讲动态规划时更是如此。
很多学生以为 DP 难在代码,其实 DP 最难的是:
状态怎么定义?状态之间有什么关系?转移顺序是什么?初始状态是什么?答案在哪里?
如果这些问题没想清楚,背再多 DP 模板,也很难真正会做题。
我更希望学生形成一种习惯:
看到一道题,不是先问“套哪个模板”,而是先问:
这题的本质是什么?数据范围允许什么复杂度?有没有重复计算?有没有单调性?有没有最优子结构?有没有图结构?有没有可以维护的信息?
当这些问题想清楚以后,模板才有意义。
模板应该是思考之后的表达,而不是思考之前的替代品。
所以在我的课堂里,模板通常不是第一步,而是最后一步。
先读题,再建模,再分析复杂度,再选择算法,最后才整理代码模板。
因为竞赛真正考的,不是你背了多少模板,而是你能不能判断:
什么时候该用,什么时候不能用,以及应用时哪里可能出错。
欢迎与我沟通交流

夜雨聆风