• 813最大平均值和的分组


    题目:我们将给定的数组 A 分成 K 个相邻的非空子数组 ,我们的分数由每个子数组内的平均值的总和构成。计算我们所能得到的最大分数是多少。注意我们必须使用 A 数组中的每一个数进行分组,并且分数不一定需要是整数。

    来源:https://leetcode-cn.com/problems/largest-sum-of-averages/

    法一:自己的代码

    思路:动态规划,要先正确的定义dp数组,dp[i][j]表示对0到j的i次分组的最大值.这个问题要精确控制j的范围,会大大缩短时间.

    from typing import List
    class Solution:
        def largestSumOfAverages(self, A: List[int], K: int) -> float:
            size = len(A)
            dp = [[0] * size for i in range(K)]
            dp[0][0] = A[0]
            for i in range(1,size):
                # 注意第一行只需直接求和再求平均,
                dp[0][i] = sum(A[0:i+1])/(i+1)
            for i in range(1,K):
                for j in range(i,size):
                    print('kkk',j)
                    dp[i][j] = max( dp[i-1][x] + sum(A[x+1:j+1])/(j-x) for x in range(j))
            print(dp)
            return dp[-1][-1]
    View Code

    改进后:

    from typing import List
    class Solution:
        def largestSumOfAverages(self, A: List[int], K: int) -> float:
            size = len(A)
            dp = [[0] * size for i in range(K)]
            for i in range(size):
                # 注意第一行只需直接求和再求平均,
                dp[0][i] = sum(A[:i+1])/(i+1)
            # 求和,后面任意长度求和只需相减即可
            for i in range(size)[::-1]:
                A[i] = sum(A[0:i+1])
            for i in range(1,K):
                # 这里的两个范围会大大缩短时间,之所以从i开始是因为第i次分组的时候,至少要有i个元素
                # size-K+i+1 = size-(K-(i+1)) 第i次分组的时候,最后的几个是无效的,
                # 比如K为5,即分五组,则分第3组的时候,只需到倒数第3个几个,因为要保证最后要分成5组
                for j in range(i,size-K+i+1):
                    # 这里是动态规划的关键,第i次分割的最大值,
                    # 等于第i-1次从0到x的最大值加上x到j的和的平均值 的最大值
                    dp[i][j] = max( dp[i-1][x] + (A[j]-A[x])/(j-x) for x in range(j))
            return dp[-1][-1]
    if __name__ == '__main__':
        duixiang = Solution()
        a = duixiang.largestSumOfAverages(A=[9,1,2,3,9,4,5], K=4)
        print(a)
    View Code

    ttt

  • 相关阅读:
    Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
    宝塔Linux 8888 进不去
    VSTO:使用C#开发Excel、Word【3】
    VSTO:使用C#开发Excel、Word【2】
    VSTO:使用C#开发Excel、Word【1】
    VSTO
    如何使用VSTO自动将Excel中的图表复制到Word
    VSTO杂项拾零(持续更新中……)
    控制台程序读取WIKI形式的TXT文件并一表格的形式显示在Word中
    以黄门镇黄湾村某一文档为例——简单设定单元格格式
  • 原文地址:https://www.cnblogs.com/xxswkl/p/12245637.html
Copyright © 2020-2023  润新知