--- date: 11.09.2024 type: theoretical --- **travelling salesperson** ## Definition - Approach to design algorithms - Optimal solution in polynomial time - Usually used alongside [Divide and Conquer](Divide%20and%20Conquer.md) - Used to better the time [complexity](Complexity.md), but usually worsens the space complexity ### How do we create a DP soluton? - Characterize optimal solution - Recursively define the value of an optimal solution - Compute the value - Construct an optimal solution **from the computed information** ## Problem discussion ### Calculating Fibonacci numbers - Recursion is extremely bad -> PF was wrong - Because the branches are too many - We compute f(x) where f(x) has already been computed - Memoization! #### Approaches - Linear time $\mathcal{O}(n)$ - **Bottom to top** ```pseudo F[0] = 1 F[1] = 1 for i in {2, .., n} do F[i] = F[i − 1] + F[i − 2] end for return F[n] ``` Compute the entire array and just return the result. - Memoization $\mathcal{O}(n)$ - **Top to bottom** ```javascript function fibMemo(index, cache) { cache = cache || []; if (cache[index]) return cache[index]; else { if (index < 3) return 1; else { cache[index] = fibMemo(index - 1, cache) + fibMemo(index - 2, cache); } } return cache[index]; } ``` ### [Rod cutting](https://www.geeksforgeeks.org/problems/rod-cutting0840/1) Given a rod of length N inches and an array of prices, price[]. price[i] denotes the value of a piece of length i. Determine the maximum value obtainable by cutting up the rod and selling the pieces. #### Optimal solution - Let the left part have a length $l$ - Then $R[n] = P[l] + R[n-l]$ - Where $P[l]$ is the price - First cut of length should be the maximal one ### Knight Collecting Rewards >Knight Collecting rewards Input: Integers $n, m$, table of rewards of size $n \times m$ Question: What is the maximum reward that the knight can get for its journey. #### Strategy - We look at the bounds defined by the problem statement - We know that the knight can get into the cell $(n-1, m-1)$ either from $(n-2,m-3)$ or $(n-3,m-2)$ - Hence, we have to know the most rewarding path to these two points from $(0,0)$ #### Approaches - $\mathcal{O}(n*m)$ ``` Reward(int n, int m, matrix A) Create matrix R of size n × m with −∞ values R[0, 0] = A[0, 0] for i in {0, .., n − 1} do for j in {0, .., m − 1} do R[i, j] = A[i, j] + max R[i − 1, j − 2], R[i − 2, j − 1] end for end for return R[n-1, m-1] ``` This doesn't tell us how we got there, but it does give us max rewards. We can easily include path memory by making elements be a linked list or create a separate table blah blah. ### [Longest common non-contiguous sequence](https://www.geeksforgeeks.org/longest-common-subsequence-dp-4/)[^1] > LCS Input: Two sequences X = [x1, x2, . . . xm], Y = [y1, y2, . . . , Yn]. Question: Longest common subsequence #### Strategy ![[LCS.png]] Or this formula: $$ c[i,j] = \begin{cases} 0, & \text{if } i=0 \text{ or } j=0\\ c[i-1,j-1]+1, & \text{if } i,j>0 \text{ and } x_i = y_i\\ max\{c[i,j-1], c[i-1], j\}, & \text{if } i,j>0 \text{ and } x_i \neq y_i\\ \end{cases} $$ ### [Dominating set](https://www.geeksforgeeks.org/dominant-set-of-a-graph/)[^2] in a path >Input: A path $P$ with a specified positive cost for each vertex. Output: Choose a subset of vertices $S$ with a minimum cost such that for each $v \in P$: either $v \in S$ or there is u such that $u \in S$ and $u, v$ are neighbors. #### Strategy - Identify some subproblems - $A[i]$ cost of the cheapest set $S_i \subset P_i$ which dominates all vertices in $P_i$ <- not great - $A[i,0]$ equals the cost of the cheapest $S_i$ which dominates $P_i$ and $v_i \notin S_i$ - $A[i,1]$ equals the cost of the cheapest [^1]: **contiguous** - next or near in time or sequence [^2]: [Subset of the vertices of the graph $G$, such that any vertex of $G$ is in it, or has a neighbor in it](https://en.wikipedia.org/wiki/Dominating_set)