题目:
有 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 -1
prefix = [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 temp
res = dp(0, n - 1, 1)
return res