Posted by : Ezzeldin Adel
Wednesday, June 22, 2016

Competitive Programming requires a lot, A LOT of practice. Like, years of practice if you want to excel. You should not lose confidence on failing to solve problems, since this will happen a lot. Even after you're good.

And failing to solve problems is the best way to advance on competitive programming, if you think on a solution until exhaustion. If you lose confidence on a fail, than it's game over. You have to maintain confidence even on a cascade of fails.

It consists of creative/intuitive/pragmatic usage of classical algorithms and data structures. So, any course on Algorithms will improve your knowledge on Competitive Programming. A bit of knowledge on Complexity Analysis and Discrete Mathematics is required for a good solver (For knowing the hidden-constraints of the problem just by reading it).

That said, there are several courses/books dedicated to competitive programming. What they cover are strategies/problem-classifications that allows you to think/devise an algorithm in place. For example, once you implement/solve 50 problems with dynamic programming you will create intuition to identify a problem as solvable through dynamic programming. The main Solving-Strategies/Problems-Type are:

- Dynamic Programming (Knapsack, 8-queens, Traveling Salesman)
- Backtracking (8-queens, Sudoku)
- Greedy Algorithms (Matching Pursuit, Egyptian Fractions)
- Sorting (Binary Search, Merge-sort)
- Search/Path-finding (Breadth-First Search, Depth-First Search, Djikstra)
- Network Flow Problems (Minimum Cut, Max Flow)
- Combinatorial (Permutations, Calendrical Calculations)
- Geometrical (Convex Hull, Minkwoski Sum)

- Steven Skiena is one of the best Competitive Programming Teachers, and he has a free course on C2Class (Edited: C2Class seems to be gone. But Skiena uploaded the videos on his youtube channel, I updated the link): Programming Challenges.
- There's also several course materials online, like the one from Jaehyun Park CS 97SI: Introduction to Competitive Programming Contests.
- Coursera has 4 great Courses on Algorithms, 2 are more practical "Algorithms" (Algorithms1 Algorithms2), and the other 2 are more Theoretical "Algorithms: Design and Analysis" (AlgoDesign1 AlgoDesign2). The second one (design and analysis) is very similar to a competitive programming course, but it deals with a lot of proofs.

The books I recommend are:

- ACMSolver offers a free mini-book on Competitive Programming: Art of Programming Contest, Tips and Tricks.
- Another free book is The hitchhiker's guide to competitive programming
- Steven Skiena is a great expert on Competitive Programming, and his best book to date is The Algorithm Design Manual (Yes even better than his other book focused on Competitive Programming). In the book there are very cool "War Stories" where he tells how an algorithm saved the day on a real world problem.
- Steven Halim (All masters of competitive programming start with Steven?!) has the best tome on Competitive Programming entitled... Competitive Programming.

Good tutorials are:

- TopCoder has a section where the members write Competitive Programming tutorialsAlgorithm Tutorials.
- A great resource for learning Dynamic Programming is this series of tutorials:Dynamic Programming Practice Problems.

And of course... You need to practice a lot. You already know TopCoder, but there's several other great places to practice:

- CodeForces: holds competitions almost every week.
- UVa Online Judge: Has an infinitude of problems for you to solve, its the platform used on Steve Halim Competitive Programming book. Great place to solve a problem from time to time.
- Google Code Jam: The famous annual competition, you can (and should) solve past problems.

Also, read a lot of Problem Editorials. Editorials are the analysis, and answer, to a problem done by the problem creator, or another expert.

##### Related Posts :

- Back to Home »
- acm , codeforces , competitive , courses , ezzeldin adel , icpc , mcmaster , programming , resources , solution , videos »
- Courses and resources to excel in competitive programming!

I would be more than happy to know some good sources for problem editorials you have mentioned in the last section of this most helpful article.

ReplyDeleteI appreciate the time and effort you put together to share such invaluable knowledge with us. Thanks a lot.