📖 Scenario: Imagine you are helping a robot find how many 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 variables m and n for grid dimensions
Create a 2D vector dp to store number of ways to reach each cell
Use nested for loops to fill dp with path counts
Print the number of unique paths from top-left to bottom-right
💡 Why This Matters
🌍 Real World
Robots and games often need to find ways to move through grids or maps efficiently.
💼 Career
Understanding dynamic programming and grid traversal is useful for software engineers working on pathfinding, AI, and optimization problems.
Progress0 / 4 steps
1
Set grid dimensions
Create two variables called m and n and set m = 3 and n = 3 to represent a 3 by 3 grid.
DSA Rust
Hint
Use let to create variables m and n with values 3.
2
Create DP table
Create a 2D vector called dp with m rows and n columns. Initialize all values to 1 using vec![vec![1; n]; m].
DSA Rust
Hint
Use vec![vec![1; n]; m] to create a 2D vector filled with 1s.
3
Fill DP table with path counts
Use nested for loops with variables i from 1 to m-1 and j from 1 to n-1. Update dp[i][j] to be dp[i-1][j] + dp[i][j-1].
DSA Rust
Hint
Use two for loops starting from 1 to update each cell by adding the value from above and left.
4
Print the number of unique paths
Print the value at dp[m - 1][n - 1] using println!("{}", dp[m - 1][n - 1]) to show the total unique paths.
DSA Rust
Hint
The bottom-right cell dp[m - 1][n - 1] holds the total unique paths. Print it.
Practice
(1/5)
1. What does the problem "Unique Paths in Grid DP" ask you to find? Unique Paths means:
easy
A. The number of 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 in a grid from top-left to bottom-right
D. The number of obstacles in the grid
Solution
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.
Step 2: Identify allowed moves
Only moves to the right or down are allowed, so paths are sequences of these moves.
Final Answer:
The number of ways to move from the top-left to bottom-right corner of a grid using only right and down moves -> Option A
Quick Check:
Unique Paths = Count of right/down move sequences [OK]
Hint: Count paths with only right and down moves [OK]
Common Mistakes:
Thinking about shortest path length instead of count
Including diagonal or left moves
Confusing with maximum sum path
2. Which of the following Rust code snippets correctly initializes a 2D vector dp of size m x n with all values set to 1?
easy
A. let dp = vec![vec![0; m]; n];
B. let dp = vec![vec![1; m]; n];
C. let dp = vec![vec![0; n]; m];
D. let dp = vec![vec![1; n]; m];
Solution
Step 1: Understand vector dimensions
We want a vector with m rows and n columns, so outer vector length is m, inner vector length is n.
Step 2: Check initialization values
All values should be 1, so inner vector is vec![1; n], repeated m times.
4. Identify the bug in this Rust function for unique paths and select the fix:
fn unique_paths(m: usize, n: usize) -> usize {
let mut dp = vec![vec![0; n]; m];
for i in 0..m {
for j in 0..n {
if i == 0 || j == 0 {
dp[i][j] = 1;
} else {
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
dp[m][n]
}
medium
A. Change return to dp[m-1][n-1]
B. Initialize dp with ones instead of zeros
C. Change loops to start from 1 instead of 0
D. Remove the if condition inside loops
Solution
Step 1: Check dp indexing at return
dp indices go from 0 to m-1 and 0 to n-1, so dp[m][n] is out of bounds and causes error.
Step 2: Fix return statement
Return dp[m-1][n-1] to get bottom-right cell value.
Final Answer:
Change return to dp[m-1][n-1] -> Option A
Quick Check:
Return dp[m-1][n-1] to avoid index error [OK]
Hint: Return dp[m-1][n-1], not dp[m][n] [OK]
Common Mistakes:
Returning dp[m][n] causing runtime panic
Not initializing first row and column
Starting loops incorrectly
5. Given a grid with obstacles represented by 1s and empty spaces by 0s, how would you modify the Unique Paths DP solution to count paths avoiding obstacles? Choose the correct approach:
hard
A. Use recursion without memoization to skip obstacles
B. Ignore obstacles and use normal unique paths formula; obstacles don't affect path count
C. Initialize dp with zeros; set dp[0][0] = 1 if no obstacle; for each cell, if obstacle, dp[i][j] = 0 else dp[i][j] = dp[i-1][j] + dp[i][j-1]
D. Initialize dp with ones everywhere; subtract paths passing through obstacles at the end
Solution
Step 1: Initialize dp considering obstacles
Set dp cells to 0 if obstacle present; dp[0][0] = 1 only if start is free.
Step 2: Update dp values skipping obstacles
For each cell, if obstacle, dp[i][j] = 0; else dp[i][j] = dp[i-1][j] + dp[i][j-1]. This counts only valid paths.
Final Answer:
Initialize dp with zeros; set dp[0][0] = 1 if no obstacle; for each cell, if obstacle, dp[i][j] = 0 else dp[i][j] = dp[i-1][j] + dp[i][j-1] -> Option C
Quick Check:
Obstacles block paths by setting dp cells to zero [OK]
Hint: Set dp[i][j] = 0 for obstacles, sum neighbors otherwise [OK]
Common Mistakes:
Ignoring obstacles in dp calculation
Subtracting paths after counting all
Using recursion without memoization causing inefficiency
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.