> For the complete documentation index, see [llms.txt](https://coding-9.gitbook.io/untitled/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://coding-9.gitbook.io/untitled/dynamic-programming/dp-on-grids/unique-paths.md).

# Unique Paths

## Problem Statement

<br>

There is a robot on an `m x n` grid. The robot is initially located at the **top-left corner** (i.e., `grid[0][0]`). The robot tries to move to the **bottom-right corner** (i.e., `grid[m - 1][n - 1]`). The robot can only move either down or right at any point in time.

Given the two integers `m` and `n`, return *the number of possible unique paths that the robot can take to reach the bottom-right corner*.

The test cases are generated so that the answer will be less than or equal to `2 * 109`.

&#x20;

**Example 1:**

![](https://assets.leetcode.com/uploads/2018/10/22/robot_maze.png)

<pre><code><strong>Input: m = 3, n = 7
</strong><strong>Output: 28
</strong></code></pre>

**Example 2:**

<pre><code><strong>Input: m = 3, n = 2
</strong><strong>Output: 3
</strong><strong>Explanation: From the top-left corner, there are a total of 3 ways to reach the bottom-right corner:
</strong>1. Right -> Down -> Down
2. Down -> Down -> Right
3. Down -> Right -> Down
</code></pre>

&#x20;

**Constraints:**

* `1 <= m, n <= 100`

## Intuition

```
Approach 1: Comninatorics

Approach 2: 
Recursively find which paths reach 0,0 and return 1 if yes


```

### Links

<https://leetcode.com/problems/unique-paths/description/>

### Video Links

<https://www.youtube.com/watch?v=sdE0A2Oxofw&ab_channel=takeUforward>

### Approach 1:

```
Combinatorics
```

{% code title="C++" lineNumbers="true" %}

```cpp
class Solution {
public:
    int uniquePaths(int m, int n) {

        if(m == 1 || n == 1)
            return 1;
        m--;
        n--;
        if(m < n) {              // Swap, so that m is the bigger number
            swap(m,n);
        }
        long res = 1;
        int j = 1;
        for(int i = m+1; i <= m+n; i++, j++){   
            // Instead of taking factorial, keep on multiply & divide
            res *= i;
            res /= j;
        }
            
        return res;
    }
};
```

{% endcode %}

### Approach 2:

```
Memoization
```

{% code title="C++" lineNumbers="true" %}

```cpp
class Solution {
public:
    int path(int i,int j, vector<vector<int>> &dp){
        if(i==0 and j==0)
            return 1;

        if(i<0 or j<0)
            return 0;

        if(dp[i][j] != -1)
            return dp[i][j];

        int l = path(i-1,j,dp);
        int r = path(i,j-1,dp);

        return dp[i][j] = l+r;
    }

    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m,vector<int>(n,-1));
        dp[0][0] = 1;
        return path(m-1,n-1,dp);
    }
};
```

{% endcode %}

### Approach 3:

```
Tabulation
```

{% code title="C++" lineNumbers="true" %}

```cpp
class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m,vector<int>(n,-1));
        dp[0][0] = 1;

        for(int i=0; i<m; i++){
            for(int j = 0; j < n; j++) {
                if(i == 0 and j == 0)   continue;
                int l=0,r=0;
                if(i>0)
                    l = dp[i-1][j];
                if(j>0)
                    r = dp[i][j-1];

                dp[i][j] = l+r;
            }
        }

        return dp[m-1][n-1];
    }
};
```

{% endcode %}

### Approach 4:

```
Space Optimization
```

{% code title="C++" lineNumbers="true" %}

```cpp
class Solution {
public:
    int uniquePaths(int m, int n) {
        // vector<vector<int>> dp(m,vector<int>(n,-1));
        // dp[0][0] = 1;
        vector<int> dp(n,1);
        dp[0] = 1;

        for(int i=1; i<m; i++){
            vector<int> temp(n);   
            for(int j = 0; j < n; j++) {
                if(i == 0 and j==0)   continue;
                int up=0,left=0;
                if(i>0)
                    up = dp[j];
                if(j>0)
                    left = temp[j-1];

                temp[j] = up+left;
            }
            dp  = temp;
        }

        return dp[n-1];
    }
};
```

{% endcode %}

### Similar Problems

###
