合并石头的最低成本 -- 三维动规数组

这是一个关于使用动态规划解决合并石头问题的算法实现。代码中定义了一个`Solution`类,包含`mergeStones`和`process3`两个方法,用于找出将所有石头合并成一堆的最低成本。算法首先检查是否能将石头按要求合并,然后通过递归计算不同分割方式的成本,并存储在动态规划表`dp`中,以避免重复计算。
摘要由CSDN通过智能技术生成

题目描述

题目链接:1000. 合并石头的最低成本

有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头。
每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的总数。
找出把所有石头合并成一堆的最低成本。如果不可能,返回 -1 。

在这里插入图片描述

代码实现

class Solution:
    def mergeStones(self, arr: List[int], k: int) -> int:
        n = len(arr)
        if (n-1) % (k-1) != 0:
            return -1

        pre_sum = [0]*(n+1)
        for i in range(n):
            pre_sum[i+1] += pre_sum[i] + arr[i]
        dp = [[[0]*(k+1) for _ in range(n)] for _ in range(n)]
        return self.process3(0, n-1, 1, arr, k, pre_sum, dp)

    def process3(self, L, R, part, arr, k, pre_sum, dp):

        """
        arr[L..R] 一定要弄出part份,返回最低代价
        :param L:
        :param R:
        :param part:
        :param arr:
        :param k:
        :param pre_sum:
        :return:
        """
        if dp[L][R][part] != 0:
            return dp[L][R][part]

        if L == R:
            return 0 if part == 1 else -1
        # L ... R 不只一个数
        if part == 1:
            next_ = self.process3(L, R, k, arr, k, pre_sum, dp)
            if next_ == -1:
                return -1
            else:
                dp[L][R][part] = next_ + pre_sum[R+1] - pre_sum[L]
                return next_ + pre_sum[R+1] - pre_sum[L]
        else:
            ans = float('inf')
            for mid in range(L, R, k-1):
                # L..mid(一份); mid+1...R(part - 1)
                next1 = self.process3(L, mid, 1, arr, k, pre_sum, dp)
                next2 = self.process3(mid+1, R, part-1, arr, k, pre_sum, dp)
                if next1 != -1 and next2 != -1:
                    ans = min(ans, next1+next2)
            dp[L][R][part] = ans
            return ans

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NLP_wendi

谢谢您的支持。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值