Him*_*ury 10
+1对于说经验的人是最好的老师.
有几个在线门户网站有很多编程问题,您可以提交自己的解决方案,并获得自动通过/失败指示.
该USACO训练场地就是培训课程,所有的美国奥林匹克计算参与者经历.它一步一步地引入越来越复杂的算法.
首先,您必须了解问题域.对于错误问题的优雅解决方案是不好的,在大多数情况下也不是解决正确问题的低效解决方案.换句话说,解决方案质量通常是相对的.如果每周计划一次计划,那么具有运行十分钟的确定性解决方案的简单调度问题可能没问题,但如果计划每天改变几次,则可能需要在几秒钟内收敛的遗传算法解决方案.
其次,将问题分解为子问题以及与解决方案元素相对应的已知/未知元素.有时这很明显,例如,计算小部件需要一种识别小部件的方法,一个可递增的计数器,以及一种存储计数的方法.有时它并不那么明显.有时您必须同时分解问题,域和可能的解决方案,并尝试在它们之间进行几种不同的映射,以找到导致正确结果的映射[这是一般方法].
至少在头脑中对解决方案进行建模,然后浏览它以查看它是否正常工作.根据需要进行调整(参见上面的分解和映射).
很多时候,您可以找到问题的元素和解决方案的元素,这些元素相互映射并产生有用的部分结果.该组合物和界面结构提供了解决方案的核心,并且还用于减少剩余问题的范围.那么你只需要一个较小的初始问题循环回到顶部,然后重复一遍.
当然,经验是最好的老师,但阅读不同类型的问题和解决方案也会有所帮助.研究一些众所周知的算法及其应用同样非常有用,例如Dijkstra,Bresenham,Unification,当然还有图论.