If you want to improve your problem solving skills, I'd suggest solving actual problems. Data structures and algorithms can be very satisfying in their own right, but the real value is in taking a real-world problem and translating it into code.
It also depends what you want to do with your knowledge. There are domains that are deeply technical and require a lot of the things you've mentioned, but they also tend to be pretty hard to break into. A lot of software is not so deep. Any software project will have need for good domain modeling, architecture, and maintainability. Again, these are things best learned through practice.
I'd love to use herb toothpaste, but it all seems to be very expensive and fluoride-free. I found one I really liked at a drugstore in Paris once, but I can't seem to get it in the US.
I really want to see a Steve Urkel "Did I do that?" sticker for completeness.