Advertisement
goodwish

168. Burst Balloons

Oct 24th, 2019
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.46 KB | None | 0 0
  1. Burst Balloons,
  2. 区间型动态规划, 区间长度 len 从小到大循环, 2 to n; 然后循环起点 i, 0 to n - len.
  3.  
  4. 子问题, 从最后出现结果的情况开始思考, 反推.
  5. - 设f[i][j]为扎破i+1~j-1号气球,最多获得的金币数.
  6. - i和j不能扎破
  7. f[i][j] = max i<k<j {f[i][k] + f[k][j] + a[i] * a[k] * a[j]}, k 是 i..j 中间某个气球.
  8.  
  9. 方程: f[i][j] = max(f[i][j], f[i][mid] + f[mid][j] + A[i] * A[mid] * A[j])
  10.  
  11. 初始条件:f[0][1] = f[1][2] == f[N][N+1] = 0
  12. – 当没有气球要扎破时,最多获得0枚金币
  13.  
  14. 计算顺序: 按照区间长度 len or (j-i) 从小到大的顺序去算.
  15. – f[0][1], f[1][2], f[2][3],, f[N][N+1]
  16. – f[0][2], f[1][3], f[2][4],, f[N-1][N+1]
  17. –…
  18. – f[0][N+1]
  19.  
  20. 时间复杂度O(n^3),空间复杂度O(n^2)
  21.  
  22. class Solution:
  23.     """
  24.    @param nums: A list of integer
  25.    @return: An integer, maximum coins
  26.    """
  27.     def maxCoins(self, nums):
  28.         # init
  29.         A = [1] + nums + [1]
  30.         # print(A)
  31.         n = len(A)
  32.         f = [[-float("inf")] * n for _  in range(n)]
  33.         # print(f)
  34.        
  35.         for i in range(n - 1):
  36.             f[i][i + 1] = 0
  37.        
  38.         for size in range(2, n):
  39.             for i in range(n - size):
  40.                 j = i + size
  41.                 for mid in range(i + 1, j):
  42.                     f[i][j] = max(f[i][j], f[i][mid] + f[mid][j] + A[i] * A[mid] * A[j])
  43.         return f[0][n - 1]
  44.  
  45. nums = [4, 1, 5, 10]
  46. # Output:270
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement