Bird
Raised Fist0
DSA Javascriptprogramming~20 mins

Unique Paths in Grid DP in DSA Javascript - 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 code that calculates unique paths in a 3x3 grid?
DSA Javascript
function uniquePaths(m, n) {
  const dp = Array(m).fill().map(() => Array(n).fill(1));
  for (let i = 1; i < m; i++) {
    for (let j = 1; j < n; j++) {
      dp[i][j] = dp[i-1][j] + dp[i][j-1];
    }
  }
  return dp[m-1][n-1];
}
console.log(uniquePaths(3, 3));
A9
B6
C12
D3
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 the first row and column represent the maximum number of paths possible.
BBecause the first row and column are obstacles and cannot be crossed.
CBecause there is only one way to reach any cell in the first row or first column, by moving only right or only down.
DBecause the first row and column are not used in the calculation.
Attempts:
2 left
💡 Hint
Think about how you can move from the start to cells in the first row or column.
❓ Predict Output
advanced
2:30remaining
Output with Obstacles in Grid
What is the output of the code below that calculates unique paths in a 3x3 grid with an obstacle at position (1,1)?
DSA Javascript
function uniquePathsWithObstacles(obstacleGrid) {
  const m = obstacleGrid.length;
  const n = obstacleGrid[0].length;
  const dp = Array(m).fill().map(() => Array(n).fill(0));
  dp[0][0] = obstacleGrid[0][0] === 0 ? 1 : 0;
  for (let i = 1; i < m; i++) {
    dp[i][0] = (obstacleGrid[i][0] === 0 && dp[i-1][0] === 1) ? 1 : 0;
  }
  for (let j = 1; j < n; j++) {
    dp[0][j] = (obstacleGrid[0][j] === 0 && dp[0][j-1] === 1) ? 1 : 0;
  }
  for (let i = 1; i < m; i++) {
    for (let j = 1; j < n; j++) {
      if (obstacleGrid[i][j] === 0) {
        dp[i][j] = dp[i-1][j] + dp[i][j-1];
      } else {
        dp[i][j] = 0;
      }
    }
  }
  return dp[m-1][n-1];
}

const grid = [
  [0,0,0],
  [0,1,0],
  [0,0,0]
];
console.log(uniquePathsWithObstacles(grid));
A2
B4
C3
D0
Attempts:
2 left
💡 Hint
The obstacle blocks some paths, reducing the total count.
🔧 Debug
advanced
2:00remaining
Identify the Error in DP Implementation
What error will the following code produce when calculating unique paths in a 3x3 grid?
DSA Javascript
function uniquePaths(m, n) {
  const dp = Array(m).fill(Array(n).fill(1));
  for (let i = 1; i < m; i++) {
    for (let j = 1; j < n; j++) {
      dp[i][j] = dp[i-1][j] + dp[i][j-1];
    }
  }
  return dp[m-1][n-1];
}
console.log(uniquePaths(3, 3));
AAll rows in dp refer to the same array, causing incorrect results.
BReturns 0 because dp is initialized with zeros.
CTypeError because dp is not an array.
DSyntaxError due to missing semicolons.
Attempts:
2 left
💡 Hint
Check how the dp array is initialized and whether rows are independent.
🚀 Application
expert
3:00remaining
Number of Unique Paths in a 5x7 Grid
How many unique paths are there from the top-left to the bottom-right corner in a 5x7 grid if you can only move right or down?
A462
B330
C792
D210
Attempts:
2 left
💡 Hint
Use the formula for combinations: (m+n-2) choose (m-1).

Practice

(1/5)
1. What does the problem Unique Paths in Grid DP ask you to find?
easy
A. The number of different ways to move from the top-left to bottom-right corner of a grid using only right and down moves.
B. The shortest path length from top-left to bottom-right in a grid.
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 goal

    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: Differentiate from other path problems

    It is not about shortest path length, maximum sum, or obstacles count, but about counting unique paths.
  3. Final Answer:

    The number of different ways to move from the top-left to bottom-right corner of a grid using only right and down moves. -> Option A
  4. Quick Check:

    Unique paths count = number of ways to move right/down [OK]
Hint: Count paths by moving only right or down [OK]
Common Mistakes:
  • Confusing unique paths with shortest path length
  • Thinking about obstacles when none are given
  • Counting diagonal moves
2. Which of the following JavaScript code snippets correctly initializes a 2D array dp of size m x n filled with zeros for the Unique Paths problem?
easy
A. const dp = Array.from({ length: m }, () => Array(n).fill(0));
B. const dp = Array(m).fill(Array(n).fill(0));
C. const dp = new Array(m).map(() => new Array(n));
D. const dp = Array(m).map(() => Array(n));

Solution

  1. Step 1: Understand array initialization in JavaScript

    Using Array.from with a mapping function creates independent inner arrays, avoiding shared references.
  2. Step 2: Analyze each option

    const dp = Array(m).fill(Array(n).fill(0)); shares the same inner array reference for all rows, causing bugs. Options C and D create inner arrays with undefined elements instead of zeros (missing .fill(0)). const dp = Array.from({ length: m }, () => Array(n).fill(0)); correctly creates independent arrays filled with zeros.
  3. Final Answer:

    const dp = Array.from({ length: m }, () => Array(n).fill(0)); -> Option A
  4. Quick Check:

    Use Array.from with arrow function for 2D array [OK]
Hint: Use Array.from with function to avoid shared inner arrays [OK]
Common Mistakes:
  • Using fill with array directly causing shared references
  • Not filling inner arrays with zeros (elements undefined)
  • Not initializing inner arrays separately
3. What is the output of the following JavaScript code for uniquePaths(3, 3)?
function uniquePaths(m, n) {
  const dp = Array.from({ length: m }, () => Array(n).fill(0));
  for (let i = 0; i < m; i++) dp[i][0] = 1;
  for (let j = 0; j < n; j++) dp[0][j] = 1;
  for (let i = 1; i < m; i++) {
    for (let j = 1; j < n; j++) {
      dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
    }
  }
  return dp[m - 1][n - 1];
}
console.log(uniquePaths(3, 3));
medium
A. 3
B. 6
C. 9
D. 12

Solution

  1. Step 1: Initialize dp array and base cases

    Set first row and first column to 1 because only one way to reach cells in first row or column.
  2. Step 2: Fill dp using sum of top and left cells

    Calculate dp[1][1] = 1+1=2, dp[1][2] = 1+2=3, dp[2][1] = 2+1=3, dp[2][2] = 3+3=6.
  3. Final Answer:

    6 -> Option B
  4. Quick Check:

    Unique paths in 3x3 grid = 6 [OK]
Hint: Sum paths from top and left neighbors [OK]
Common Mistakes:
  • Not initializing first row and column to 1
  • Adding instead of summing dp[i-1][j] and dp[i][j-1]
  • Off-by-one errors in loops
4. The following code attempts to solve the Unique Paths problem but overwrites values across multiple rows unexpectedly for uniquePaths(3, 3). What is the bug?
function uniquePaths(m, n) {
  const dp = Array(m).fill(Array(n).fill(0));
  for (let i = 0; i < m; i++) dp[i][0] = 1;
  for (let j = 0; j < n; j++) dp[0][j] = 1;
  for (let i = 1; i < m; i++) {
    for (let 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 array is not initialized with zeros.
B. The loops start from 1 instead of 0.
C. Using fill with array causes all rows to reference the same array.
D. The return statement is outside the function.

Solution

  1. Step 1: Analyze dp initialization

    Using Array(m).fill(Array(n).fill(0)) makes all rows point to the same inner array, so updating one row updates all rows.
  2. Step 2: Understand effect on dp updates

    Setting dp[i][0] = 1 changes the same array for all rows. During table filling, updates overwrite values from earlier rows (e.g., dp[1][1] becomes 3 instead of 2), causing incorrect intermediate values.
  3. Final Answer:

    Using fill with array causes all rows to reference the same array. -> Option C
  4. Quick Check:

    Shared references cause wrong dp updates [OK]
Hint: Avoid fill with array; use Array.from for independent rows [OK]
Common Mistakes:
  • Using fill with array causing shared references
  • Incorrect loop ranges
  • Misplaced return statement
5. Given a grid with obstacles represented by a 2D array obstacleGrid where 1 means obstacle and 0 means free cell, how would you modify the Unique Paths DP solution to count unique paths avoiding obstacles?
hard
A. Set dp[i][j] = 1 for all cells without checking obstacles.
B. Ignore obstacles and calculate paths as usual.
C. Use recursion without memoization to count paths.
D. Initialize dp with zeros, set dp[0][0] = 1 if no obstacle, then for each cell dp[i][j] = 0 if obstacle else dp[i-1][j] + dp[i][j-1].

Solution

  1. Step 1: Initialize dp considering obstacles

    Set dp[0][0] to 1 only if the start cell has no obstacle; otherwise 0.
  2. Step 2: Update dp cells with obstacle check

    For each cell, if obstacleGrid[i][j] is 1, dp[i][j] = 0 (no path). Else dp[i][j] = dp[i-1][j] + dp[i][j-1].
  3. Step 3: Return dp[m-1][n-1]

    This gives the count of unique paths avoiding obstacles.
  4. Final Answer:

    Initialize dp with zeros, set dp[0][0] = 1 if no obstacle, then for each cell dp[i][j] = 0 if obstacle else dp[i-1][j] + dp[i][j-1]. -> Option D
  5. Quick Check:

    Obstacle cells block paths by setting dp to 0 [OK]
Hint: Set dp=0 for obstacles, sum paths only for free cells [OK]
Common Mistakes:
  • Ignoring obstacles in dp calculation
  • Not initializing start cell properly
  • Using recursion without memoization causing inefficiency
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