Leetcode # 808. Soup Servings

https://leetcode.com/problems/soup-servings

Solution: DP, Bottom-Up

a 數量為 na ,湯b 數量為 nb
ma := ceil(na / 25)
mb := ceil(nb / 25)
dp[ma][mb] 則為回傳的答案

  1. dp[0][0] = 0.5
  2. ma == 0, mb > 0 ⇒ dp = 1
  3. ma > 0, mb == 0 ⇒ dp = 0 

\begin{align}
dp[m_a][m_b] = \frac{1}{4}( & dp[\mathop{max}(0, m_a – 4)][m_b] \\
+ & dp[\mathop{max}(0, m_a – 3)][\mathop{max}(0, m_b – 1)] \\
+ & dp[\mathop{max}(0, m_a – 2)][\mathop{max}(0, m_b – 2)] \\
+ & dp[\mathop{max}(0, m_a – 1)][\mathop{max}(0, m_b – 3)] )
\end{align}

又,1 >= dp[ma][mb] >= 0
⇒ dp[m + 1][m + 1] >= dp[m][m]

加上本題許可的誤差 10-5 
當 dp[m][m] > 0.99999 == 1 – 0.00001
dp[m + k][m + k], k = 1, 2, 3, … 便可直接回傳為 1

Time Complexity: O(len(n) ** 2)O(1)
Space Complexity: O(len(n) ** 2)O(1)
(The input and output generally do not count towards the space complexity.)

令 ε = 10-5誤差容忍 (error tolerance)
當 m0 滿足 dp[m0][m0] > 1 − ε便進入了誤差容忍的範圍
這使得我們有個常數上限,所以 time/space complexity 皆為 O(1)

 

class Solution:
  def soupServings(self, n: int) -> float:
    m = ceil(n / 25)
    dp = [[0.5]]
    serving = [
      [4, 0], [3, 1], [2, 2], [0, 0]
    ]
    def calculate_dp(ma, mb):
      return (dp[max(0, ma - 4)][mb] \
            + dp[max(0, ma - 3)][max(0, mb - 1)]\
            + dp[max(0, ma - 2)][max(0, mb - 2)]\
            + dp[max(0, ma - 1)][max(0, mb - 3)]) / 4

    for ma in range(1, m + 1):
      dp.append([0])
      dp[0].append(1) # 借用給 dp[0][mb]
      for mb in range(1, ma + 1):
        dp[ma].append(calculate_dp(ma, mb))
        if ma != mb:
          dp[mb].append(calculate_dp(mb, ma))
      if dp[ma][ma] > 1 - 1e-5: return 1

    return dp[m][m]

dp 的生成順序

  0 1 2 3 4
0 a c f k r  
1 b d h m t  
2 e g i o v  
3 j l n p x  
4 q s u w y  
           
  • 建構於 dp = [[0.5]]
  • 建構於 dp.append([0])
  • 建構於 dp[0].append(1)
  • 建構於 dp[ma].append(calculate_dp(ma, mb))
  • 建構於 dp[mb].append(calculate_dp(mb, ma))

Solution: DP, Top-Down

如果真的使用 Top-Down 則無法受惠於 error tolerance 因而節省 complexity
有偽裝為 Top-Down 看似使用 recursive function 解答
但實際上在呼叫 recursive function 前已建立好 DP-table

Last Updated on 2023/08/16 by A1go

目錄
Bitnami