likes
comments
collection
share

Leetcode 题解 - Dynamic Programming 1D

作者站长头像
站长
· 阅读数 20

题解

Leetcode 题解 - Dynamic Programming 1D

Leetcode 题解 - Dynamic Programming 1D

Leetcode 题解 - Dynamic Programming 1D

Leetcode 题解 - Dynamic Programming 1D

Leetcode 题解 - Dynamic Programming 1D

State: (n)

State(n): how many unique BST to form with n nodes from [1, n], where i is the selected root

Leetcode 题解 - Dynamic Programming 1D

for range [1, i -1], this is calculated range for unique BST 

for range[i, n-i], this is the another range for unique BST

multiply the answer for above two ranges for final result

High Level:

  1. Initialize memo with n + 1 slots
  2. call dfs(n)

dfs(n):

  1. Base case (n <= 1)  -> return 1
  2. If memo[n] != null   -> return memo[n]
  3. Ask subproblems for answers:

        a. for i in [1,n]:

            i. left = dfs(i-1), right = dfs(n-i)

            ii. result = left * right

    4. Update memo[n] and return result

Leetcode 题解 - Dynamic Programming 1D

时间复杂度:O(n**2)

另可以用正向填表:把dfs的flow反过来,从底层子问题开始往大计算,最终计算到顶层问题

High Level 

  1. Initialize memo[n + 1]
  2. Fill out base case  -> memo[0] = memo[1] = 1
  3. for i in [2,n]:

        a. Use Transition Rule  ->  for j in [1, i]:

            i. memo[i] += memo[j-1] * memo[i - j]

    4. return memo[n]

Leetcode 题解 - Dynamic Programming 1D

时间复杂度:O(n**2)

Leetcode 题解 - Dynamic Programming 1D

Leetcode 题解 - Dynamic Programming 1D

思路

Leetcode 题解 - Dynamic Programming 1D

Leetcode 题解 - Dynamic Programming 1D

High Level

  1. Initialize memo

  2. Call dfs(s,n)

dfs(s,n)

  1. Base case -> n <= 1 return 1
  2. If memo[n] != null -> return memo[n]
  3. Ask Subproblems for answers

       a. if x is valid (not 0) -> result += memo[n-1]

       b. if xx is valid (<= 26) -> result += memo[n-2]

    4. Update memo and return result 

Leetcode 题解 - Dynamic Programming 1D

Leetcode 题解 - Dynamic Programming 1D