
Algorithms in a Nutshell does a great job of introducing data structures and algorithms. It's also very short. Data structures and particularly basic graph algorithms (DFS, BFS, DSP) are very powerful and can solve a lot of common problems.
After that, study Math. Algebra, Set Theory, Automata and Calculus were real eye openers. Schaum's Outline of Discrete Mathematics is a good start in discrete math.
Automata: if you can, try and get hold of the Coursera course on the subject. It's excellent. It is hard work, but it got it through my thick skull :)
Then, compilers! They're awesome. They changed the way I think about development, and also in one feel swoop destroyed a lot of respect I had for the industry. I read "Engineering a Compiler" and followed the excellent Coursera course.
Did learning that make me a better developer? In some ways, yes. I'm capable of solving problems that I thought were impossible a few years ago. On the other hand, it is now clear to me that our industry is building castles on sand too often, and that makes me sad.
I feel like Algernon.
[1]http://www.amazon.com/Mathematical-Ideas-Edition-Charles-Mil...
[2]http://www.amazon.com/Concepts-Modern-Mathematics-Dover-Book...
[3]http://www.amazon.com/Schaums-Outline-Discrete-Mathematics-R...
Obviously Skiena's book is in C- so be somewhat familiar with it. Again no need to go crazy deep into C before you start. You can learn as you go.
I'd recommend just diving in and using other resources as references if you come across anything you don't know, rather than spending too much time working though "pre-requisites".
Actual, specific approaches to tackling tough problems are taught by the famous Hungarian mathematician George Polya in his classic book How to Solve It [3].
Discrete Mathematics is a field that covers a number of areas, but especially in counting problems (from combinatorics) and graph theory there are a number of results that are not hard to grasp but lead to beautiful solutions for real problems. There are many powerful theorems and principles in discrete math that will unlock seemingly impossible problems. Unfortunately, the books for this subject are mostly written for math majors that are interested not only the application of these results but how to prove them and consequently the books may not appeal to everyone. Perhaps something like Schaum's Outline of Discrete Mathematics would suitably cover the way to apply some of the important theorems without bogging down in the proofs.
Finally, I think there is value in doing small interesting programming projects. Two older books, available used, with interesting projects are Etudes for Programmers by Wetherell [5] and Software Tools in Pascal by Kernighan and Plauger [6]. Etudes has my favorite exercise for trying out new programming languages, building an interpreter for the simple TRAC programming language; Software Tools has a number of programs in Pascal that do interesting things, try implementing the programs in your programming language--they cover a range of difficulties and the book has a nice discussion for each that explains why the programs are structured the way they are.
A more advanced book, Structure and Interpretation of Programming Languages, available as a downloadable pdf [7] is a classic book for those wanting to become better programmers.
[1] https://www.amazon.com/Martin-Gardner/e/B000AP8X8G/ref=sr_tc...
[2] https://www.amazon.com/Raymond-M.-Smullyan/e/B000AQ1NF0/ref=...
[3] https://www.amazon.com/How-Solve-Mathematical-Princeton-Scie...
[4] https://www.amazon.com/Schaums-Outline-Discrete-Mathematics-...
[5] https://www.amazon.com/Etudes-Programmers-Charles-Wetherell/...
[6] https://www.amazon.com/Software-Tools-Pascal-Brian-Kernighan...