Bird
Raised Fist0
DSA Goprogramming~20 mins

Unique Paths in Grid DP in DSA Go - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Unique Paths Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of Unique Paths Calculation
What is the output of the following Go code that calculates unique paths in a 3x3 grid?
DSA Go
package main
import "fmt"
func uniquePaths(m int, 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]
}
func main() {
    fmt.Println(uniquePaths(3, 3))
}
A5
B3
C6
D9
Attempts:
2 left
💡 Hint
Think about how many ways you can move right or down to reach the bottom-right corner.
🧠 Conceptual
intermediate
1:30remaining
Understanding DP Table Initialization
Why do we initialize the first row and first column of the DP table with 1 in the Unique Paths problem?
ABecause there is only one way to reach any cell in the first row or first column by moving only right or down.
BBecause the first row and column represent obstacles that block paths.
CBecause the first row and column are always zero in the DP table.
DBecause the first row and column represent the maximum number of paths possible.
Attempts:
2 left
💡 Hint
Think about how you can move from the start to cells in the first row or column.
🔧 Debug
advanced
2:00remaining
Identify the Bug in DP Update Loop
What error will occur when running this code snippet for unique paths in a grid?
DSA Go
func uniquePaths(m int, 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]
}
Ano error, returns correct result
Bcompilation error: missing return statement
Creturns 0 instead of correct paths
Druntime error: index out of range
Attempts:
2 left
💡 Hint
Check the loop boundaries carefully.
🚀 Application
advanced
1:30remaining
Number of Unique Paths in a 4x5 Grid
Using the unique paths DP approach, how many unique paths are there in a 4 rows by 5 columns grid?
A56
B35
C70
D20
Attempts:
2 left
💡 Hint
Use the formula or DP logic: paths = combination(m+n-2, m-1).
❓ Predict Output
expert
2:30remaining
Output of Unique Paths with Obstacles
What is the output of this Go code that calculates unique paths in a grid with obstacles? 0 means free cell, 1 means obstacle.
DSA Go
package main
import "fmt"
func uniquePathsWithObstacles(obstacleGrid [][]int) int {
    m := len(obstacleGrid)
    n := len(obstacleGrid[0])
    dp := make([][]int, m)
    for i := range dp {
        dp[i] = make([]int, n)
    }
    if obstacleGrid[0][0] == 1 {
        return 0
    }
    dp[0][0] = 1
    for i := 1; i < m; i++ {
        if obstacleGrid[i][0] == 0 && dp[i-1][0] == 1 {
            dp[i][0] = 1
        }
    }
    for j := 1; j < n; j++ {
        if obstacleGrid[0][j] == 0 && dp[0][j-1] == 1 {
            dp[0][j] = 1
        }
    }
    for i := 1; i < m; i++ {
        for j := 1; j < n; j++ {
            if obstacleGrid[i][j] == 0 {
                dp[i][j] = dp[i-1][j] + dp[i][j-1]
            }
        }
    }
    return dp[m-1][n-1]
}
func main() {
    grid := [][]int{
        {0,0,0},
        {0,1,0},
        {0,0,0},
    }
    fmt.Println(uniquePathsWithObstacles(grid))
}
A2
B4
C3
D1
Attempts:
2 left
💡 Hint
Obstacles block paths. Count only valid routes avoiding obstacles.

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

  1. 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.
  2. Step 2: Identify the meaning of "Unique Paths"

    Unique paths means counting distinct ways, not shortest or maximum sum paths.
  3. 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
  4. 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?
easy
A. dp := [][]int{} dp = append(dp, make([]int, m)) dp = append(dp, make([]int, n))
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

  1. 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.
  2. 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.
  3. Final Answer:

    dp := make([][]int, m) for i := range dp { dp[i] = make([]int, n) } -> Option D
  4. 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

  1. 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).
  2. 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.
  3. Final Answer:

    6 -> Option C
  4. 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

  1. 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.
  2. 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.
  3. Final Answer:

    The dp update uses multiplication instead of addition -> Option A
  4. 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

  1. 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.
  2. 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.
  3. 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
  4. 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 unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard