package LeetCode_62
/**
* 62. Unique Paths
* https://leetcode.com/problems/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?
* */
class Solution {
/*
* solution:DP, Top-Down, Time complexity:O(mn), Space complexity:O(mn)
* current position just care about it's left one and top one
* */
fun uniquePaths(m: Int, n: Int): Int {
val dp = Array(m + 1) { IntArray(n + 1) { 0 } }
return topDownSolution(m, n, dp)
}
private fun topDownSolution(x: Int, y: Int, dp: Array<IntArray>): Int {
if (x == 0 || y == 0) {
return 0
}
if (x == 1 && y == 1) {
return 1
}
if (dp[x][y] > 0) {
return dp[x][y]
}
var res = 0
for (i in 0 until x) {
for (j in 0 until y) {
val topPath = topDownSolution(x, y - 1, dp)
val leftPath = topDownSolution(x - 1, y, dp)
res = topPath + leftPath
}
}
dp[x][y] = res
return res
}
}