Target: >=5 problems in Codechef Long Div 2

Expected time: 4–5 months

Follow these steps.

**1**. Learn how to use basic data structures like stack, queue and hash table using C++ STL or Java Collections.

**2**. Then follow this list: Competitive Programming: From Beginner to Expert (https://www.commonlounge.com/discussion/5d2822257dfa49328d85fd27cf114441) . This list contains the best tutorials and links to the best problems of each topic compiled from all over the internet. Trust me, I have scanned the whole internet and couldn’t find a better free resource. You can take competitive programming courses by Coding Blocks or Coding Ninjas instead, but they are paid.

**3**. When you reach the Dynamic Programming section, watch this video by Rachit Jain: Lecture 1: Dynamic Programming Made Easy - DP states, Recurrence Relations (https://www.youtube.com/watch?v=tb_14w_-mNw) . Also read the DP tutorial from this link: Kickstart Codelab (http://goo.gl/VSb8AD) (This tutorial is made by Googlers specifically for teaching Dynamic Programming)

4. It would be great if you could work on your combinatorics and basic mathematical problem solving skills as well.

Some tips:

1. In greedy problems, you mostly get an intuition on how to solve a problem and you are not confirmed of its correctness. Its okay to guess but at least know that you are guessing. I have seen people being overconfident about their wrong solutions without any proof.

2. Try to form the recurrence of DP problems by thinking recursive brute force solution and then forming recurrence from it. Dont go for bottom up solution directly. Hence strengthen your recursion by solving some problems like:

1. Printing all the permutations of a word.

2. Printing all subsets of a set by recursion.

3. Must read: correctness proof of Dijkstra and MSTs. Done? Great! Now you have learnt these algorithms.