题目:
有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头。每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的总数。找出把所有石头合并成一堆的最低成本。如果不可能,返回 -1 。示例 1:输入:stones = [3,2,4,1], K = 2输出:20解释:从 [3, 2, 4, 1] 开始。合并 [3, 2],成本为 5,剩下 [5, 4, 1]。合并 [4, 1],成本为 5,剩下 [5, 5]。合并 [5, 5],成本为 10,剩下 [10]。总成本 20,这是可能的最小值。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/minimum-cost-to-merge-stones著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
答案:
时间:
没做出来
class Solution:def mergeStones(self, stones: List[int], K: int) -> int:n=len(stones)if (n-1)%(K-1):return -1prefix = [0] * (n+1)for i in range(1,n+1): prefix[i] = stones[i-1] + prefix[i-1]@functools.lru_cache(None)def dp(i, j, m):if i == j:return 0 if m == 1 else float("inf")if m == 1:return dp(i, j, K) + prefix[j + 1] - prefix[i]temp=float("inf")for mid in range(i, j, K - 1):temp=min(temp, dp(i, mid, 1) + dp(mid + 1, j, m - 1) )return tempres = dp(0, n - 1, 1)return res
