题目:

  1. N 堆石头排成一排,第 i 堆中有 stones[i] 块石头。
  2. 每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的总数。
  3. 找出把所有石头合并成一堆的最低成本。如果不可能,返回 -1
  4. 示例 1
  5. 输入:stones = [3,2,4,1], K = 2
  6. 输出:20
  7. 解释:
  8. [3, 2, 4, 1] 开始。
  9. 合并 [3, 2],成本为 5,剩下 [5, 4, 1]。
  10. 合并 [4, 1],成本为 5,剩下 [5, 5]。
  11. 合并 [5, 5],成本为 10,剩下 [10]。
  12. 总成本 20,这是可能的最小值。
  13. 来源:力扣(LeetCode
  14. 链接:https://leetcode-cn.com/problems/minimum-cost-to-merge-stones
  15. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

答案:

时间:

没做出来

  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 i == j:
  10. return 0 if m == 1 else float("inf")
  11. if m == 1:
  12. return dp(i, j, K) + prefix[j + 1] - prefix[i]
  13. temp=float("inf")
  14. for mid in range(i, j, K - 1):
  15. temp=min(temp, dp(i, mid, 1) + dp(mid + 1, j, m - 1) )
  16. return temp
  17. res = dp(0, n - 1, 1)
  18. return res

要点:

1. 这题目 太复杂了,考虑的要素过多。。。

其他:

代码报错:无