📖 Scenario: Imagine you are helping a robot find how many different ways it can move from the top-left corner to the bottom-right corner of a grid. The robot can only move right or down.
🎯 Goal: Build a program that calculates the number of unique paths the robot can take in a grid of size m x n using dynamic programming.
📋 What You'll Learn
Create two integer variables m and n for grid dimensions
Create a 2D slice dp to store the number of ways to reach each cell
Use nested for loops to fill the dp slice based on previous results
Print the number of unique paths from top-left to bottom-right
💡 Why This Matters
🌍 Real World
Robots navigating factory floors or delivery drones planning routes in a grid-like city.
💼 Career
Understanding dynamic programming helps solve optimization problems in software engineering and algorithm design.
Progress0 / 4 steps
1
Set grid dimensions
Create two integer variables called m and n and set m = 3 and n = 3 to represent a 3 by 3 grid.
DSA Go
Hint
Use m := 3 and n := 3 to create the grid size variables.
2
Create the DP table
Create a 2D slice of integers called dp with m rows and n columns. Initialize all values to 1.
DSA Go
Hint
Use make([][]int, m) to create rows and a nested loop to fill each row with 1s.
3
Fill the DP table with unique paths counts
Use nested for loops with variables i and j starting from 1 to update dp[i][j] as the sum of dp[i-1][j] and dp[i][j-1].
DSA Go
Hint
Start loops from 1 because the first row and column are already set to 1.
4
Print the number of unique paths
Use fmt.Println to print the value of dp[m-1][n-1], which is the number of unique paths to the bottom-right corner.
DSA Go
Hint
Use fmt.Println(dp[m-1][n-1]) to print the final count.
Practice
(1/5)
1. What does the problem "Unique Paths in Grid DP" ask you to find? Unique Paths means:
easy
A. The shortest path length from top-left to bottom-right in a grid
B. The number of ways to move from top-left to bottom-right in a grid using only right and down moves
C. The maximum sum path from top-left to bottom-right in a grid
D. The number of obstacles in the grid
Solution
Step 1: Understand the problem statement
The problem asks for counting all possible paths from the top-left corner to the bottom-right corner of a grid, moving only right or down.
Step 2: Identify the meaning of "Unique Paths"
Unique paths means counting distinct ways, not shortest or maximum sum paths.
Final Answer:
The number of ways to move from top-left to bottom-right in a grid using only right and down moves -> Option B
Quick Check:
Unique Paths = Count of right/down moves paths [OK]
Hint: Unique Paths count all right/down routes from start to end [OK]
Common Mistakes:
Confusing unique paths with shortest path length
Thinking about obstacles when none are given
Mixing path count with path sum
2. Which of the following Go code snippets correctly initializes a 2D slice dp of size m x n with zeros for Unique Paths DP?
B. dp := make([]int, m*n)
for i := 0; i < m*n; i++ {
dp[i] = 0
}
C. var dp [m][n]int
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
dp[i][j] = 1
}
}
D. dp := make([][]int, m)
for i := range dp {
dp[i] = make([]int, n)
}
Solution
Step 1: Understand Go slice initialization for 2D arrays
In Go, a 2D slice is created by first making the outer slice, then initializing each inner slice.
Step 2: Check each option
dp := make([][]int, m)
for i := range dp {
dp[i] = make([]int, n)
} correctly creates a slice of length m, then each inner slice of length n, all initialized to zero by default.
Final Answer:
dp := make([][]int, m)
for i := range dp {
dp[i] = make([]int, n)
} -> Option D
Quick Check:
2D slice init with nested make loops = dp := make([][]int, m)
for i := range dp {
dp[i] = make([]int, n)
} [OK]
Hint: Use nested make to create 2D slices in Go [OK]
Common Mistakes:
Using one-dimensional slice for 2D data
Initializing inner slices with wrong length
Appending slices incorrectly
3. What is the output of the following Go code for Unique Paths in a 3x3 grid?
func uniquePaths(m, n int) int {
dp := make([][]int, m)
for i := range dp {
dp[i] = make([]int, n)
}
for i := 0; i < m; i++ {
dp[i][0] = 1
}
for j := 0; j < n; j++ {
dp[0][j] = 1
}
for i := 1; i < m; i++ {
for j := 1; j < n; j++ {
dp[i][j] = dp[i-1][j] + dp[i][j-1]
}
}
return dp[m-1][n-1]
}
fmt.Println(uniquePaths(3, 3))
medium
A. 3
B. 9
C. 6
D. 1
Solution
Step 1: Initialize dp with 1s on first row and column
First row and first column are set to 1 because only one way to reach those cells (all right or all down).
Step 2: Fill dp table using dp[i][j] = dp[i-1][j] + dp[i][j-1]
Calculate paths for each cell by summing paths from top and left cells. For 3x3 grid, dp[2][2] = 6.
Final Answer:
6 -> Option C
Quick Check:
Unique paths in 3x3 grid = 6 [OK]
Hint: Use dp[i][j] = dp[i-1][j] + dp[i][j-1] to fill grid [OK]
Common Mistakes:
Not initializing first row and column to 1
Using wrong indices in dp update
Returning wrong dp cell
4. The following Go code for Unique Paths has a bug. What is the error?
func uniquePaths(m, n int) int {
dp := make([][]int, m)
for i := range dp {
dp[i] = make([]int, n)
}
for i := 0; i < m; i++ {
dp[i][0] = 1
}
for j := 0; j < n; j++ {
dp[0][j] = 1
}
for i := 1; i < m; i++ {
for j := 1; j < n; j++ {
dp[i][j] = dp[i-1][j] * dp[i][j-1]
}
}
return dp[m-1][n-1]
}
medium
A. The dp update uses multiplication instead of addition
B. The dp slice is not initialized properly
C. The loops for initializing first row and column are swapped
D. The function returns dp[0][0] instead of dp[m-1][n-1]
Solution
Step 1: Check dp update formula
The code uses dp[i][j] = dp[i-1][j] * dp[i][j-1], which multiplies paths instead of adding them.
Step 2: Correct formula for Unique Paths
The correct formula is dp[i][j] = dp[i-1][j] + dp[i][j-1] to sum the number of ways from top and left cells.
Final Answer:
The dp update uses multiplication instead of addition -> Option A
Quick Check:
Use addition, not multiplication in dp update [OK]
Hint: Sum paths from top and left, don't multiply [OK]
Common Mistakes:
Using * instead of + in dp update
Forgetting to initialize first row/column
Returning wrong dp cell
5. Given a 4x4 grid with some obstacles represented by 1s, how would you modify the Unique Paths DP approach to count paths avoiding obstacles? Obstacles grid:
0 0 0 0
0 1 0 0
0 0 1 0
0 0 0 0
hard
A. Set dp[i][j] = 0 if obstacle at (i,j), else dp[i][j] = dp[i-1][j] + dp[i][j-1]
B. Ignore obstacles and use normal dp formula
C. Set dp[i][j] = 1 if obstacle at (i,j), else 0
D. Use multiplication of dp[i-1][j] and dp[i][j-1] for obstacles
Solution
Step 1: Identify obstacle handling in DP
When a cell has an obstacle, no path can go through it, so dp[i][j] must be 0.
Step 2: Modify dp update to skip obstacles
For cells without obstacles, dp[i][j] = dp[i-1][j] + dp[i][j-1]. For obstacles, dp[i][j] = 0.
Final Answer:
Set dp[i][j] = 0 if obstacle at (i,j), else dp[i][j] = dp[i-1][j] + dp[i][j-1] -> Option A
Quick Check:
Obstacles block paths, set dp to zero there [OK]
Hint: Zero dp at obstacles, sum paths otherwise [OK]
Common Mistakes:
Ignoring obstacles in dp calculation
Setting dp to 1 at obstacles
Multiplying dp values instead of adding
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.