【leetcode】813. Largest Sum of Averages

该博客主要介绍了如何解决LeetCode上的一个算法问题——找到一个整数数组分割成连续子数组后的平均值之和最大值。文章通过两种方法来解决这个问题,一是使用记忆化回溯策略,二是采用二维动态规划矩阵。代码实现分别用Python进行了演示,并详细解释了解题思路和关键步骤,帮助读者理解动态规划和回溯在解决这类问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

https://leetcode.com/problems/largest-sum-of-averages/submissions/

题目大意:

讲一个整数数组分成连续的K个子数组,问这K个子数组的平均值之和的最大值是多少?

解决思路:

就相当于在len(A)长度的数组中存在的len(A)-1个间隔中插入K-1个“隔板”使得分隔开来的K个连续子数组平均值之和最大。

可以使用回溯进行遍历。这里注意到当前几个隔板放置好后,余下的数组长度和隔板数量对应的子问题答案是会在回溯过程中被反复求解的,也就是出现了重复子问题,可以使用动态规划,即记忆化回溯。使用一个memory字典记录(长度,隔板数目)对应的子问题的解

另一个思路是直接使用dp矩阵进行求解。思路类似矩阵相乘次数最少那道题目(后续补充)

python 记忆化回溯代码:

class Solution(object):
    def largestSumOfAverages(self, A, K):
        """
        :type A: List[int]
        :type K: int
        :rtype: float
        """
        memory = {}
        res = [0]
        self.helper(A,K,memory,0,res)
        print(memory)
        return res[0]
        
    def helper(self,A,K,memory,now_sum,res):
        if K>len(A):
            return 0
        elif K==len(A):
            res[0] = max(res[0],now_sum + sum(A))
            return sum(A)
        elif K<len(A) and K==1:
            res[0] = max(res[0],now_sum + float(sum(A))/len(A))
            return float(sum(A))/len(A)
        else:
            if (len(A),K) in memory:
                res[0] = max(res[0],now_sum + memory[(len(A),K)])
            else:
                memory[(len(A),K)] = -1
                for i in range(0,len(A)-1):
                    memory[(len(A),K)] = max(memory[(len(A),K)],float(sum(A[:i+1]))/(i+1)+self.helper(A[i+1:],K-1,memory,now_sum + float(sum(A[:i+1]))/(i+1),res))
                res[0] = max(res[0],now_sum + memory[(len(A),K)])
            return memory[(len(A),K)]

二维dp矩阵python代码:

class Solution(object):
    def largestSumOfAverages(self, A, K):
        """
        :type A: List[int]
        :type K: int
        :rtype: float
        """
        def dp(A, K):
            dp = [[0] * len(A) for _ in range(K)]
            for j in range(len(A)):
                dp[0][j] = self.mean(A[:j + 1])
            for k in range(1, K):
                for j in range(k, len(A)):
                    for i in range(j):
                        dp[k][j] = max(dp[k][j], dp[k - 1][i] + self.mean(A[i + 1:j + 1]))
            return dp[-1][-1]
        return dp(A, K)
    
    def mean(self,L):
        return float(sum(L))/len(L)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值