What if you could instantly know all possible routes in a maze without walking them?
Why Unique Paths in Grid DP in DSA C++?
Imagine you are in a big city grid, starting at the top-left corner, and you want to reach the bottom-right corner by only moving right or down. You try to count all possible ways by listing each path on paper.
Counting paths manually is slow and confusing because the number of paths grows very fast as the grid gets bigger. You might miss some paths or count some twice. It becomes impossible to keep track without making mistakes.
Dynamic Programming helps by breaking the problem into smaller parts. It counts paths to each cell using results from nearby cells, storing answers to avoid repeated work. This way, it quickly finds the total unique paths without listing them all.
int countPaths(int row, int col) {
if (row == 0 && col == 0) return 1;
int left = (col > 0) ? countPaths(row, col - 1) : 0;
int up = (row > 0) ? countPaths(row - 1, col) : 0;
return left + up;
}#include <vector> using namespace std; int uniquePaths(int rows, int cols) { vector<vector<int>> dp(rows, vector<int>(cols, 1)); for (int r = 1; r < rows; r++) { for (int c = 1; c < cols; c++) { dp[r][c] = dp[r-1][c] + dp[r][c-1]; } } return dp[rows-1][cols-1]; }
This method lets you quickly find how many ways to reach any point in a grid, even for very large grids, without getting lost in counting.
Robots in a warehouse need to know how many different routes they can take to deliver packages efficiently without collisions.
Manual counting of paths is slow and error-prone.
Dynamic Programming stores intermediate results to avoid repeated work.
It efficiently calculates total unique paths in a grid.
Practice
Given a grid of size m x n, how many unique paths exist from the top-left corner to the bottom-right corner if you can only move right or down?Solution
Step 1: Understand the problem statement
The problem asks for counting all possible unique paths from the top-left to bottom-right corner of a grid, moving only right or down.Step 2: Clarify what is being counted
We count the number of ways to reach the destination, not the shortest path or sums.Final Answer:
The number of different ways to reach the bottom-right corner moving only right or down -> Option AQuick Check:
Unique paths count = number of ways [OK]
- Confusing path count with shortest path length
- Thinking about obstacles when none are given
- Mixing sum of values with path count
dp of size m x n with all values 0 in C++?Solution
Step 1: Understand 2D vector initialization syntax
In C++, a 2D vector is initialized by specifying rows and columns with default values.Step 2: Check each option
std::vector dp(m, std::vector<int>(n, 0)); correctly creates a vector with m rows and n columns, all initialized to 0.Final Answer:
std::vector dp(m, std::vector<int>(n, 0)); -> Option CQuick Check:
Correct 2D vector init syntax = std::vector dp(m, std::vector<int>(n, 0)); [OK]
- Swapping m and n in initialization
- Using wrong vector constructor parameters
- Missing default value initialization
int m = 3, n = 3;
std::vector dp(m, std::vector<int>(n, 0));
for (int i = 0; i < m; i++) dp[i][0] = 1;
for (int j = 0; j < n; j++) dp[0][j] = 1;
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
std::cout << dp[m-1][n-1] << std::endl;Solution
Step 1: Initialize first row and column
First row and column are set to 1, representing only one path to each cell along edges.Step 2: Fill dp table using dp[i][j] = dp[i-1][j] + dp[i][j-1]
Calculate dp values for inner cells:
dp[1][1] = 1+1=2
dp[1][2] = 1+2=3
dp[2][1] = 2+1=3
dp[2][2] = 3+3=6Final Answer:
6 -> Option DQuick Check:
Unique paths in 3x3 grid = 6 [OK]
- Not initializing first row and column to 1
- Using wrong indices in dp update
- Confusing addition with multiplication
int uniquePaths(int m, int n) {
std::vector dp(m, std::vector<int>(n));
for (int i = 0; i < m; i++) dp[i][0] = 1;
for (int j = 0; j < n; j++) dp[0][j] = 1;
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
dp[i][j] = dp[i-1][j] * dp[i][j-1];
}
}
return dp[m-1][n-1];
}Solution
Step 1: Check dp update formula
The code uses multiplication: dp[i][j] = dp[i-1][j] * dp[i][j-1], which is incorrect for counting paths.Step 2: Correct formula for unique paths
The correct formula adds the number of ways from top and left cells: dp[i][j] = dp[i-1][j] + dp[i][j-1].Final Answer:
The multiplication operator should be addition in dp update -> Option AQuick Check:
Use addition, not multiplication for path counts [OK]
- Using multiplication instead of addition in dp formula
- Returning wrong dp cell
- Not initializing first row or column
Consider the grid:
0 0 0 0 1 0 0 0 0
Solution
Step 1: Handle obstacles in dp initialization
If a cell has an obstacle (value 1), set dp[i][j] = 0 because no path can go through it.Step 2: Update dp values considering obstacles
For other cells, dp[i][j] = dp[i-1][j] + dp[i][j-1], summing paths from top and left only if those cells are reachable.Final Answer:
Set dp[i][j] = 0 if grid[i][j] is 1, else dp[i][j] = dp[i-1][j] + dp[i][j-1] -> Option BQuick Check:
Obstacles block paths, set dp to 0 there [OK]
- Ignoring obstacles in dp calculation
- Using multiplication instead of addition
- Setting dp to 1 for obstacle cells
Ready to prove it?
Pass the test and this pattern moves unknown
