# Unique Paths

## Description

A robot is located at the top-left corner of a _m_ x _n_ grid (marked 'Start' in the diagram below).

The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below).

How many possible unique paths are there?

![](https://leetcode.com/static/images/problemset/robot_maze.png)\
Above is a 7 x 3 grid. How many possible unique paths are there?

**Note:** _m_ and _n_ will be at most 100.

**Example 1:**

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

**Example 2:**

```
Input: m = 7, n = 3
Output: 28
```

## Solutions

### Combinatorial approach

$$
\frac{(m + n - 2)!} {(m - 1)!\,(n - 1)!}
$$

```cpp
class Solution {
public:
    int uniquePaths(int m, int n) {
        if(m < n) return uniquePaths(n, m);
        long long prod = 1;
        for(int i = m; i < m + n - 1; ++i){
            prod *= i;
        }
        for(int i = 2; i < n; ++i){
            prod /= i;
        }
        return prod;
    }
};
```

### Dynamic programming

```cpp
class Solution {
public:
    int uniquePaths(int m, int n) {
        if(m < 2 || n < 2) return 1;
        vector<vector<int>> dp(m, vector<int>(n,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];
    }
};
```
