有关做题方法论的新思考

猛猛训了五天 CF,感觉自己对于做题有了新的理解。

如果把解题的过程比作在一张图上找路径,那么经验就是你的启发式函数,方法论就是你的搜索策略。

某一题的思路秒出,是因为你的启发式函数足够强,强到无需考虑其它路径的可能,无意识地就得到了答案。这就是经验的力量,或者说是直觉。

同学评价 zak 做NOI题目的流程:

读读题目,观察一会;

想到若干个算法组合,发现思路正确;

写会代码,略微修改,AC;

身边其他同学做NOI题目流程:

读读题目,观察一会; 想到可能的算法;

仔细想想,发现假了;

突然想到一种可能的做法,但是非常复杂,犹豫啊;

写代码试试看,发现问题,有些细节要优化;

不知不觉时间不够了;

而且2-3的步骤经常会循环。。。

(引自知乎用户“未知的健忘”的回答)

这就是直觉的力量。我认为 zak 之所以能达到如此之高的水平,和他平时大量做题积累的经验和直觉是离不开的。别人还在想这样能不能做出来的时候,它已经知道这样做不了了。别人还在盲目尝试解法的时候,大量的经验形成的直觉告诉他:这样做是对的。所以他才能做的又快又好。

客观上讲,做不出一道题目的情况是不存在的。通过有意识地穷举所有路径,总能找到一条对的路径。所以大部分的“我做不出这题”是伪命题。

那为什么我们还会“卡题”呢?因为如果某个套路我们没见过,它的启发式函数值就特别低,低到你看都不会看。比如你从来不知道某个算法,那你在做题的时候就不会想着去用它。好在这是可以通过有意识地枚举来改变的。

做题的本质是更新启发式函数,以及增强自己的搜索意识。

讲了这么多理论,我们来讲点实际的东西。做一道题目的一般步骤是什么呢?

  1. 读题,看数据范围,看样例,考虑过程与边界。这一切都是为了让你对这个题目有大概的理解,然后才能激发你的直觉,也为方法论的实施做铺垫。
  2. 运气好的情况,你的直觉被激发出来了,记住你的直觉,这很宝贵。选一个你觉得最对的方向深入。
  3. 运气不好的情况,你读完题目还是一头雾水,蒙蒙的感觉。这个时候也不要怕,你的启发式函数没带给你任何东西,所以这时候只能摸黑走夜路。想想你的方法论,不断地尝试试错,直到你的方法论都不能带给你任何东西的时候,才宣布失败。
  4. 方法论-直觉 是可以交替进行的。
  5. 做出题目之后总结经验,优化方法论。

感觉 > 方法。