# Question

Formatted question description: https://leetcode.ca/all/62.html

62	Unique Paths

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?

Above is a 3 x 7 grid. How many possible unique paths are there?

Note: m and n will be at most 100.

@tag-array


# Algorithm

Using Dynamic Programming to solve, you can maintain a two-dimensional array dp, where dp[i][j] represents the number of different moves to the current position, and then the state transition equation can be obtained as: dp[i][j ] = dp[i-1][j] + dp[i][j-1], here in order to save space, use a one-dimensional array dp, refresh line by line.

# Code

• 
public class Unique_Paths {

class Solution {
public int uniquePaths(int m, int n) {

if (m <= 0 || n <= 0) {
return 0;
}

int[][] dp = new int[m][n];

for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {

if (i == 0 || j == 0) {
dp[i][j] = 1;
} else { // i,j both not 1
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}

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

}

############

class Solution {
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
for (int i = 0; i < m; ++i) {
Arrays.fill(dp[i], 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];
}
}

• // OJ: https://leetcode.com/problems/unique-paths/
// Time: O(MN)
// Space: O(N)
class Solution {
public:
int uniquePaths(int m, int n) {
vector<int> dp(n + 1, 0);
dp[n - 1] = 1;
for (int i = m - 1; i >= 0; --i) {
for (int j = n - 1; j >= 0; --j) dp[j] += dp[j + 1];
}
return dp[0];
}
};

• class Solution:
def uniquePaths(self, m: int, n: int) -> int:
dp = [[1] * n for _ in range(m)]
for i in range(1, m):
for j in range(1, n):
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
return dp[-1][-1]

############

class Solution(object):
def uniquePaths(self, m, n):
"""
:type m: int
:type n: int
:rtype: int
"""
dp = [1] * n

for i in range(1, m):
pre = 1
for j in range(1, n):
dp[j] = dp[j] + pre
pre = dp[j]
return dp[-1]


• func uniquePaths(m int, n int) int {
dp := make([][]int, m)
for i := 0; i < m; i++ {
dp[i] = make([]int, n)
}
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if i == 0 || j == 0 {
dp[i][j] = 1
} else {
dp[i][j] = dp[i-1][j] + dp[i][j-1]
}
}
}
return dp[m-1][n-1]
}

• function uniquePaths(m: number, n: number): number {
let dp = Array.from({ length: m }, v => new 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];
}


• impl Solution {
pub fn unique_paths(m: i32, n: i32) -> i32 {
let (m, n) = (m as usize, n as usize);
let mut dp = vec![1; n];
for i in 1..m {
for j in 1..n {
dp[j] += dp[j - 1];
}
}
dp[n - 1]
}
}