模板:

最小化:

  1. class Solution:
  2. def minCost(self, n: int, cuts: List[int]) -> int:
  3. cuts.sort()
  4. cuts=[0]+cuts+[n]
  5. m=len(cuts)
  6. dp=[[float("inf")]*(m) for _ in range(m)]
  7. dp[0][0] = 0
  8. for i in range(1,m):
  9. dp[i][i] = 0;
  10. dp[i-1][i] = 0;
  11. for l in range(m-2,-1,-1):
  12. for r in range(l+1,m):
  13. for k in range(l+1,r):
  14. dp[l][r]=min(dp[l][r],dp[l][k]+dp[k][r]+cuts[r]-cuts[l])
  15. return dp[0][m-1]

最大化:

  1. class Solution:
  2. def maxCoins(self, nums: List[int]) -> int:
  3. nums=[1]+nums+[1]
  4. n=len(nums)
  5. dp=[[0]*(n) for _ in range(n)]
  6. for i in range(n-2,-1,-1):
  7. for j in range(i+1,n):
  8. for k in range(i+1,j):
  9. dp[i][j]=max(dp[i][j],nums[i]*nums[k]*nums[j]+dp[i][k]+dp[k][j])
  10. return dp[0][n-1]

K组合并:

  1. class Solution:
  2. def mergeStones(self, stones: List[int], K: int) -> int:
  3. n=len(stones)
  4. if (n-1)%(K-1):return -1
  5. prefix = [0] * (n+1)
  6. for i in range(1,n+1): prefix[i] = stones[i-1] + prefix[i-1]
  7. @functools.lru_cache(None)
  8. def dp(i, j, m):
  9. if (j - i + 1 - m) % (K - 1):
  10. return float("inf")
  11. if i == j:
  12. return 0 if m == 1 else float("inf")
  13. if m == 1:
  14. return dp(i, j, K) + prefix[j + 1] - prefix[i]
  15. temp=float("inf")
  16. for mid in range(i, j, K - 1):
  17. temp=min(temp, dp(i, mid, 1) + dp(mid + 1, j, m - 1) )
  18. return temp
  19. res = dp(0, n - 1, 1)
  20. return res