#algorithm #processing

idea

Dynamics programming allows to process algorithm that require re-calculation of the same sub-problem several time. For example: fibonacci.

It works for problems where:

  1. Optimal sub-structure, i.e. it's solved exactly by solving subproblems
  2. Overlap of sub-problems, e.g. Fibo.

The idea is to instead calculate the subproblem only once and re-use.

Bottom-up = to calculate $Fibo(n)$, start with $F(1)$, then $F(2)$, etc., until reaching $F(n)$

    public int Fib(int n) {
        if (n == 0) {
            return 0;
        }
        if (n == 1) {
            return 1;
        }
        var res1 = 1;
        var res2 = 0;
        for (var i = 2; i < n; i++) {
            var res = res1 + res2;
            res2 = res1;
            res1 = res;
        }
        return res1 + res2;
    }

Top-down = calculate $Fibo(n)$, then store each of the sub results in a hash map not to recalculate.

public class Solution {
    private Dictionary<int, int> memos = new Dictionary<int, int>();
    public int Fib(int n) {
        if (n == 0) {
            return 0;
        }
        if (n == 1) {
            return 1;
        }
        if (memos.ContainsKey(n)) {
            return memos[n];
        }
        return Fib(n - 1) + Fib(n - 2);
    }
}

links

references

https://leetcode.com/explore/featured/card/dynamic-programming/630/an-introduction-to-dynamic-programming/4094/