#### Overview of this book

C++ is a mature multi-paradigm programming language that enables you to write high-level code with a high degree of control over the hardware. Today, significant parts of software infrastructure, including databases, browsers, multimedia frameworks, and GUI toolkits, are written in C++. This book starts by introducing C++ data structures and how to store data using linked lists, arrays, stacks, and queues. In later chapters, the book explains the basic algorithm design paradigms, such as the greedy approach and the divide-and-conquer approach, which are used to solve a large variety of computational problems. Finally, you will learn the advanced technique of dynamic programming to develop optimized implementations of several algorithms discussed in the book. By the end of this book, you will have learned how to implement standard data structures and algorithms in efficient and scalable C++ 14 code.
Table of Contents (11 chapters)
About the Book
Free Chapter
1. Lists, Stacks, and Queues
2. Trees, Heaps, and Graphs
3. Hash Tables and Bloom Filters
4. Divide and Conquer
5. Greedy Algorithms
6. Graph Algorithms I
7. Graph Algorithms II
8. Dynamic Programming I
9. Dynamic Programming II

## What Is Dynamic Programming?

The best way to answer this question is by example. To illustrate the purpose of dynamic programming, let's consider the Fibonacci sequence:

{ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, … }

By observing the preceding sequence, we can see that, beginning with the third element, each term is equal to the sum of the two preceding terms. This can be simply expressed with the following formula:

F(0) = 0

F(1) = 1

F(n) = F(n-1) + F(n-2)

As we can clearly see, the terms of this sequence have a recursive relationship – the current term, F(n), is based on the results of previous terms, F(n-1) and F(n-2), and thus the preceding equation, that is, F(n) = F(n-1) + F(n-2), is described as the recurrence relation of the sequence. The initial terms, F(0) and F(1), are described as the base cases, or the points in which a solution is produced without the need to recurse further. These operations are shown in the following figure: