Advertisement
goodwish

593. Stone Game II

Nov 24th, 2019
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.57 KB | None | 0 0
  1. 593. Stone Game II 区间型动态规划
  2.  
  3. 在 Stone Game 之一的基础上, A 是一个环形数组, 尝试每一个断点, 将环断开.
  4.  
  5. way 1, 实现: A 数组 double, 即 A.append(A),
  6. (DP) f 数组从 n 延长到 2n, 计算每一段长度为 n 的子数组的最少组合, 相当于尝试每一个断点, 取结果最小的一段.
  7. 计算顺序: length in 0..n, length 和之一一样, 最长到 n.
  8.  
  9. 最后一步: min(左半边 + 右半边, 尝试每种拆分 分组, mid in l..r) + 子数组和.
  10. 子问题, f[l][r] = Min (mid in l..r) (f[l][mid] + f[mid+1][r]) + sum(A[l:r+1])
  11. 初始化:
  12. f[l][r] = 0
  13. 计算顺序:
  14. length (ln) in 1..n:
  15. - l in 0..n-length:
  16. - r = l + length;
  17.  
  18. f[][] 当中, i in 0..n-1: 取 f[i][i+n-1] 值最小的一个.
  19.  
  20. <code>
  21. class Solution:
  22.     def stoneGame2(self, A):
  23.         if not A:
  24.             return 0
  25.         # init
  26.         n = len(A)
  27.         A.extend(A)
  28.        
  29.         f = [[float("inf")] * (2*n) for _ in range(2*n)]
  30.        
  31.         for ln in range(0,n):
  32.             for l in range(2*n - ln):
  33.                 r = l + ln
  34.                 if ln == 0:
  35.                     f[l][r] = 0
  36.                     continue
  37.                 # if ln == 1:
  38.                 #     f[l][r] = A[l] + A[r]
  39.                 #     continue
  40.                 for k in range(l, r):
  41.                     f[l][r] = min(f[l][r], f[l][k] + f[k+1][r])
  42.                 f[l][r] += sum(A[l:r+1])
  43.        
  44.         ans = float("inf")
  45.         for l in range(0, n):
  46.             ans = min(ans, f[l][l + n - 1])
  47.         return ans
  48.  
  49. A = [1, 1, 1, 1]
  50. # Output:8
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement