# Revision of DSA Topics
---
title: DSA 4.2 Module Description
description:
duration: 600
card_type: cue_card
---
> ### Note to Instructor: Please keep the below content pre-written on your iPad.
* Revision of DSA Topics
* Maths: Inverse Mod & Problems
* Backtracking: Famous Problems
* Tries 1: Trie of Character
* Tries 2: Trie of Bits + Problems on Trees
* Strings Pattern Matching
* DP 1: DP on Strings
* DP 2: Famous Problems
* Graphs 1: DSU, Kruskal Algorithm & Bipartite Graph
* Graphs 2: Bellman Ford & Floyd Warshall Algorithm
* Advanced Interview Problems
---
title: Agenda
description:
duration: 600
card_type: cue_card
---
Topics:
* Recursion
* DP
* Graphs => BFS and DFS
---
title: Problem 1 Scaler Adventure Park
description:
duration: 600
card_type: cue_card
---
### Problem Statement
Scaler has opened an Adventure Park and there is a staircase. Every staircase has a cost associated that you need to pay when you claims it.
You can either start from the 0th staircase or the 1st staircase.
**Goal:** What is the least amount of money you can spend to reach the top.
<img src="https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/088/874/original/a.png?1725808889" width=500px/>
**Example 1:**
A = [9, 12, 22]
Cost = 12
**Example 2:**
A = [10, 20, 5, 8, 15, 25, 10, 12]
Cost = 10+5+15+10 = 40
### Approach
Whenever we have Notation of choices, we always go for Recursion as the solution initiallly.
Recursion gives the flexibility to make the choices.
**Notation of choice => Recursion**
**4 Step to solve any Recursion Problems:**
1. Elements of choice => Jump of 1 stair or Jump of 2 stairs.
2. What does a recursive state calculates.
Cost(2) => Minimum cost to reach the ith staircase.
3. Reccurance relationship
<img src="https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/088/875/original/a.png?1725808923" width=500px/>
The last state is dependent on the Penultimate states,
`Cost(i) = min(Cost(i-1), Cost(i-2)+A[i])`
<img src="https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/088/908/original/a.png?1725816267" width=500px/>
**Base Case**
Before moving to 4th step, Lets discuss the base case part
Values of i for which transition goes out of sounds
<img src="https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/088/909/original/a.png?1725816314" width=500px/>
So here we cant make use of the recurrence relation.
Here we will directly declare the base cases.
```cpp
Cost(0) = A[0]
Cost(1) = A[1]
```
4. Which reccursive state is your answer?
`min(cost(N - 1), cost(N - 2))`
### Pseudo Code
```java
int cost (i) {
if(i == 0 || i == 1){
return A[i];
}
return min(cost(i - 1),cost(i - 2)) + A[i];
}
Ans = min(cost(N - 1), cost(N - 2));
```
### Complexity
**Time complexity**: O(2$^N$)
**Space Complexity**: O(Height of rear tree) = O(N)
---
title: Scaler Adventure Park Optimisation
description:
duration: 600
card_type: cue_card
---
### Possiblity of DP
1. Optimal Substructure
2. Overlapping Subproblems
<img src="https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/088/910/original/a.png?1725816355" width=500px />
Lets look into both the approaches one by one!
**1. Top Down DP**
Recursion + Memoization.
Lets modify the recursion code
### Pseudo Code
```cpp
DP[N] = {-1}
int cost(i){
if(i == 0 || i == 1){
return A[i];
}
if(DP[i] != -1){
return DP[i];
}
DP[i] = min(cost(i - 1),cost(i - 2)) + A[i];
return DP[i];
}
Ans = min(DP[N - 1], DP[N - 2]);
```
### Dry Run
<img src="https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/088/911/original/a.png?1725816393" width=500px/>
### Complexity
**Time complexity**: O(N)
**Space Complexity**: N + N
Time complexity of rear solution = (# recursive cells) * (Time per recursive cell)
**2. Bottom Up DP**
We will move from Left to Right,
<img src="https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/088/913/original/a.png?1725816461" width=500px/>
### Pseudo Code
```cpp
DP[N]
DP[0] = A[0]
DP[1] = A[1]
for(i = 2; i < N; i++){
DP[i] = min(DP[i - 1], DP[i - 2]) + A[i];
}
return min(DP[N - 1], DP[N - 2]);
```
### Complexity
**Time complexity**: O(N)
**Space Complexity**: N
# Top Down v/s Bottom Up.
1. No stack space in Bottom Up.
2. Top Down is more in
3. Bottom Up gives more control.
### Optimised Version on Space
```cpp
costi2 = A[0]
costi1 = A[1]
for(i = 2; i < 2; i++){
temp = min(costi1, costi2) + A[i];
costi2 = costi1;
costi1 = temp;
}
return min(costi1, costi2);
```
### Complexity
**Time complexity**: O(N)
**Space Complexity**: O(1)
---
title: Graphs
description:
duration: 600
card_type: cue_card
---
### Definition
Nodes connected via edges
What is the other data structure, which as the similar definition?
> Tree
### Main Difference Between Trees and Graphs
1. Trees are hierarchical unlike graphs.
2. Number of edges in a tree with N nodes is N - 1
### Classification of Graphs
**1. Facebook => Undefined Graph**
In Facebook, Lets say, If A is a Friend of B, then it implies, B is a Friend of A.
<img src="https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/070/352/original/graph.png?1712261639" width=200 />
**2. Instagram => Directed Graph**
Lets say, If A is following B, does it implies, that B is following A ? No!
<img src="https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/070/353/original/graph.png?1712262966" width=300 />
Examples:
<img src="https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/088/878/original/a.png?1725809817" width = 500px />
**3. Weighted and Unweighted Graph**
<img src="https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/088/876/original/a.png?1725809534" width=500px/>
**4. Cyclic Undirected and Acyclic Undirected graph**
<img src="https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/088/877/original/a.png?1725809682" width=500px/>
**4. Cyclic directed and Acyclic directed graph**
<img src="https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/088/879/original/a.png?1725809980" width=500px/>
> NOTE: Type of graph will be given in question.
---
title: Graph Inputs
description:
duration: 600
card_type: cue_card
---
### How graph is given as I/P ?
<img src = "https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/088/880/original/a.png?1725810098" width = 500px />
Example:
10 14 (N = 10, E = 14)
2 3 (These next 10 lines are the edges)
4 7
8 9
2 7
7 8
10 1
4 6
5 8
2 6
10 9
7 10
3 5
7 1
1 1
In Questions, it is given as follows:
1. Undirected or Directed
2. Weighted or Unweighted
>Note that Cyclic or Acyclic is not given in the Question.
---
title: Store a Graph
description:
duration: 600
card_type: cue_card
---
### Store A Graph
Lets Consider this graph, and will see, how to store this.
<img src="https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/088/881/original/a.png?1725810341" width=500px/>
There are two famous Representation,
**1. Adjacency Matrix**
Lets have an 2-D array, M[N][N].
* M[i][j] = 1/Weight => Edge from i to j
* M[i][j] = 0 => No edge from i to j
The adjancy matrix for the above exmaple.
<img src="https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/088/882/original/a.png?1725810471" width=500px/>
### Complexity
**Space Complexity**: O(N$^2$)
**Time Complexity**: O(E)
**2. Adjacency List**
Just store the neighbour nodes alone for a particular node.
<img src="https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/088/883/original/a.png?1725810540" width=500px/>
For a weighted graph, we use
<img src="https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/088/884/original/a.png?1725810687" width=500px/>
---
title: Traversals of Graphs
description:
duration: 600
card_type: cue_card
---
### Traversals
* Depth First Search (DFS)
* Breadth First Search (BFS)
**1. DFS**
Starting with Source as 2.
<img src="https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/088/886/original/a.png?1725810794" width=500px/>
### Pseudo Code
```cpp
visited [N] = {False}
void dfs (source){
visited [source] = True;
for(all u connected to source){
if(visited[u] == false){
dfs(u);
}
}
}
```
**2. BFS**
Starting with Source as 2.
<img src="https://d2beiqkhq929f0.cloudfront.net/public_assets/assets/000/088/887/original/a.png?1725810848" width=500px/>
### Pseudo Code
```cpp
void bfs (source){
visited(N) = {false}
Queue<int> q;
q.enqueue(source);
visited[source] = True;
while(! q.isEmpty()){
int u = q.dequeue();
for(all v converted to a){
if(visited[v] == false){
q.enqueue(v);
visited[v] = True;
}
}
}
}
```