先给出回答:自信是要靠一次次ac累积出来的。
给题主一个刷题建议。
大原则
哪怕是World Final的最难题算法,依然是由几种现成算法略微修改后组合出来的。
ACM并不要求你从零开始凭空构筑全新精妙算法,只要求对现有算法掌握的深度和广度。
对于每一道题,先自己想10分钟,认真拼命想(重要)。可以略微延长,但不必几个小时地想,效率太低。这又不是世纪初的三本acm队(逃)。
对于新手,这一步有点像在思路的迷宫里乱撞。没找到出口不要紧,但要记住走到了哪几个死胡同。
无论有没有思路,都看题解。
对比题解和自己思路的差距,找到自己的知识漏洞和思维盲区。
知识漏洞:一个现成算法的复杂度、适用范围、具体写法。
思维盲区:一个特定类型问题模型应该考虑的几个思路。做题多了,看到一个题型就立刻反应出几种可能的思路,然后一个一个思路仔细分析、细化、尝试。这就好像在迷宫里的路口一个一个走走看。一个题型的解题思路是慢慢积累的,见过一次自然就知道了(能不能想起来另说,但不用原创),类似英语固定搭配。题型识别是题感,类似学外语的语感。
第一步里想到的死胡同,有的可能确实死路,那下次遇到类似题就不要花时间想这条路了;有的其实是正确出口,但因为知识漏洞或思考盲区,而误以为走到了死路。
这时,要把自己「误以为是死路,其实是正确思路」的部分,以及「从一开始就没发现的路」,还有对应的知识漏洞和思维盲区记录下来。用在线电子笔记比较好,便于随时复习。
这个有点类似错题本,但更详细和个性化,只对自己有用,没有分享给别人的价值。
ps:第一步仔细思考很重要,如果泛泛思考,等看了题解,就会忘记自己之前卡在哪儿,结果只会说「大佬就是大佬」,「我怎么就没想到」,那这题就白刷了。因为看过题解的话解法会记得一阵子,很难回到当时的状态(知识的诅咒),只好隔一阵子再来。
实际做题,确保自己的思路正确,或者确实理解了题解。
这一阶段还能检验自己对特定算法的熟练度,比如dp、dfs、bfs之类。如果打错了,这又是一个知识漏洞,记下来。