leetcode 813 - 最大平均和的分组(动态规划)

2023-12-30 13:32

本文主要是介绍leetcode 813 - 最大平均和的分组(动态规划),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

我们将给定的数组 A 分成 K 个相邻的非空子数组 ,我们的分数由每个子数组内的平均值的总和构成。计算我们所能得到的最大分数是多少。

注意我们必须使用 A 数组中的每一个数进行分组,并且分数不一定需要是整数。

示例:
输入: 
A = [9,1,2,3,9]
K = 3
输出: 20
解释: 
A 的最优分组是[9], [1, 2, 3], [9]. 得到的分数是 9 + (1 + 2 + 3) / 3 + 9 = 20.
我们也可以把 A 分成[9, 1], [2], [3, 9].
这样的分组得到的分数为 5 + 2 + 6 = 13, 但不是最大值。

思路

很显然是个动态规划问题,状态比较好设,重点在找状态转移方程。

  • 定义状态:dp[i][k],表示前i个数分成k组,能获得的最大分数。
  • 状态转移方程:
    1)若k=1,只分一组,那么获得的分数就等于sum(A[:i]) / len(A[:i])
    2)若k>1,假设从某个位置j(1 <= j <i)划分,得到一组为A[j]~A[i],那么剩下k-1组就得从A[0]~A[j-1]中划分得到,每一次划分后得到的分数为dp[j][k-1] + avg(A[j]~A[i]),要获得最大分数,所以有:
    dp[i][k] = max(dp[j][k-1] + avg(A[j]~A[i]))
  • 初始化状态:
    1)k=1,则dp[i][1] = sum(A[:i])/len(A[:i]) = sum(A[:i]) / i
    2)i < k,dp[i][k] = dp[i][k-1]
    3)i = k,dp[i][k] = sum(A[:i])

代码

class Solution(object):def largestSumOfAverages(self, A, K):""":type A: List[int]:type K: int:rtype: float""""""dp[i][k] 表示前i个数分成k组能得到的最大分数, 1<=k<=K, 1<=i<=len(A)-1如果k=1,那么dp[i][k] = sum(A[:i])/i如果k>1,假设从某个位置j(1<=j<i)划分,得到一组为A[j]~A[i],那么剩下k-1组就需要在A[0]~A[j-1]中划分得到,每一次划分后分数为 avg(A[j]~A[i]) + dp[j][k-1],从中取max,即有状态转移方程:dp[i][k] = max(dp[j][k-1] + avg(A[j]~A[i]))"""n = len(A)dp = [[0] * (K+1) for i in range(n+1)]   # dp[i][k]表示前i个数分成k组能获得的最大分数for i in range(1, n+1):dp[i][1] = float(sum(A[:i])) / i for i in range(1, n+1):for k in range(2, K+1):if k > i:dp[i][k] = dp[i][k-1]elif k == i:dp[i][k] = float(sum(A[:i]))else:dp[i][k] = max([dp[j][k-1] + float(sum(A[j:i]))/(i-j) for j in range(1, i)])return dp[n][K]

时间复杂度固定了,空间复杂度可以减小,类似01背包问题那样,dp[i][k]其实和i没什么关系,把这个维度去掉,用一维dp数组来表示即可。

这篇关于leetcode 813 - 最大平均和的分组(动态规划)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/552982

相关文章

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同