当前位置: 首页 > news >正文

金泉网普通会员可以建设网站吗四川做网站设计的公司

金泉网普通会员可以建设网站吗,四川做网站设计的公司,广西桂林十大特产,上海城隍庙小吃街攻略Leetcode 3077. Maximum Strength of K Disjoint Subarrays 1. 解题思路 1. 朴素思路2. 算法优化 2. 代码实现 题目链接:3077. Maximum Strength of K Disjoint Subarrays 1. 解题思路 这道题很惭愧没有搞定,思路上出现了差错,导致一直没能…
  • Leetcode 3077. Maximum Strength of K Disjoint Subarrays
    • 1. 解题思路
      • 1. 朴素思路
      • 2. 算法优化
    • 2. 代码实现
  • 题目链接:3077. Maximum Strength of K Disjoint Subarrays

1. 解题思路

这道题很惭愧没有搞定,思路上出现了差错,导致一直没能搞定,最后是看了大佬的算法才搞定的,唉,不过确实比较巧妙,因此这里把我们的朴素实现思路和大佬们的思路都在这里整理一下,留个记录。

1. 朴素思路

首先,我拿到这道题目之后的一个朴素的思路就是动态规划,显然,我们就是要将一个长度为n的arr分成k段,然后在每段当中获取最大/最小的subarray的和,然后乘以因子之后求和获取最大值。

因此,我们用一个动态规划即可处理这个问题。

然后,对于中间的每一个subarry,对于如何其中最大最小值的问题,我们用一个累积数组就可以将问题转换为如何求一个array的任意元素之后最大/最小元素的问题,这个是简单的。

因此,我们就可以快速给出代码如下:

class Solution:def maximumStrength(self, nums: List[int], k: int) -> int:n = len(nums)s = list(accumulate(nums, initial=0))factors = [(i+1)*(-1)**(i%2) for i in range(k)]print(s)@lru_cache(None)def dp(idx, r):if r == 0:return 0ans = -math.infif r % 2 == 1:_min = s[idx]sub = -math.inffor i in range(idx+1, n-r+2):sub = max(sub, s[i] - _min)_min = min(_min, s[i])ans = max(ans, factors[r-1] * sub + dp(i, r-1))else:_max = s[idx]sub = math.inffor i in range(idx+1, n-r+2):sub = min(sub, s[i] - _max)_max = max(_max, s[i])ans = max(ans, factors[r-1] * sub + dp(i, r-1))return ansans = dp(0, k)return ans

不过这段代码遇到了超时问题,无法正常通过。

其原因在于虽然动态规划的总的时间复杂度是 O ( N K ) O(NK) O(NK),但是由于内部还有一重循环,导致最坏的情况下时间复杂度变成了 O ( N 2 K ) O(N^2K) O(N2K),这显然就无法通过测试样例了。

2. 算法优化

而大佬的思路则是和我们相反的,我们是考虑如何将整体的array进行分段,大佬的思路则是考察array当中每一个元素的归属,显然,这只有以下几种情况:

  • 哪个subarray都不属于
  • 属于某一个subarray
    • 与前一个元素都属于同一个subarray
    • 是一个新的subarray第一个元素

此时,我们只需要给出两个 k k k维的动态规划向量dp0, dp1,对于某一个元素,他们的任意一维i分别表示:

  • dp0[i]表示当前元素属于第 i i i个subarray时,能够获得的最大strength
  • dp1[i]表示之前所有元素被分为 i i i个subarray时,能够获得的最大strength

此时,我们显然有迭代关系:
d p 0 t ( i ) = α ⋅ n i + m a x ( d p 0 t − 1 ( i ) , d p 1 t ( i − 1 ) ) d p 1 t ( i ) = m a x ( d p 1 t − 1 ( i ) , d p 0 t ( i ) ) \begin{aligned} dp0_{t}(i) &= \alpha \cdot n_i + \mathop{max}(dp0_{t-1}(i), dp1_{t}(i-1)) \\ dp1_{t}(i) &= \mathop{max}(dp1_{t-1}(i), dp0_{t}(i)) \end{aligned} dp0t(i)dp1t(i)=αni+max(dp0t1(i),dp1t(i1))=max(dp1t1(i),dp0t(i))

由此,遍历整个长度为n的array,我们即可从dp1中得到其所有元素被分至 k k k个subarray时能够获得的最大strength。

我们将其翻译为代码语言即可。

2. 代码实现

给出python代码实现如下:

class Solution:def maximumStrength(self, nums: List[int], k: int) -> int:factors = [(k-i)*(-1)**(i%2) for i in range(k)]# dp0 stand for consecutive and dp1 for inconsecutivedp0 = [-math.inf for _ in range(k)]dp1 = [-math.inf for _ in range(k)]for num in nums:# s[i] stand for max result including num in ith subarrays = [-math.inf for _ in range(k)]s[0] = num * factors[0] + max(0, dp0[0])for i in range(1, k):s[i] = num * factors[i] + max(dp0[i], dp1[i-1])for i in range(k):dp1[i] = max(dp1[i], s[i])dp0 = sreturn dp1[-1]

提交代码评测得到:耗时2386ms,占用内存18MB。

http://www.yayakq.cn/news/106203/

相关文章:

  • 网站设计一般要求怎么做网站相关关键词
  • 网站后台什么语中国建筑网招聘信息
  • 长沙建设网站制作wordpress分类树
  • 深夜小网站电脑做网站服务器视频教程
  • 网站维护公司推荐做期货的一般看什么网站
  • 网站建设著作权国外交易平台
  • 四川建设机械网站世界500强企业的标准是什么
  • 那个企业建网站好网站怎么做本地映射
  • 兴化建设局网站2016网站设计欣赏
  • 网站开发教程全集制作医院网站
  • 网站规划设计的一般流程wordpress默认邮件文件夹
  • 湘潭网站建设 磐石网络优质天元建设集团有限公司破产重组
  • 利用access数据库做网站网站分类有哪几类
  • 个人免费网站平台哪个好纺织厂网站模板
  • 网站编程技术 吉林出版集团股份有限公司常用的网站开发平台api
  • 网站建设施工方案河北唐山 网站建设
  • 群晖nda做网站在线看国内永久免费crm
  • 最有效的网站推广费用怎么样免费给网站做优化
  • 合肥庐阳区建设局网站山西网站建设制作推广
  • 珠海模板开发建站做图模板下载网站
  • 做美食分享网站源码建交互网站需要多少钱
  • 淘宝网现状 网站建设网站一个月
  • 室内设计效果图怎么画宁波seo关键词优化教程
  • 深圳专业做网站建网站十大营销策略有哪些
  • 上海企业网站建设服务外贸建个网站多少钱
  • wp做网站难吗大型网站建设的价格
  • 做网站业务的怎么寻找客户河南网站建设官网
  • 公司网站建设费怎么入账银川网站建设培训哪家好
  • 常熟有没有做网站的百度移动点击排名软件
  • 金融网站建设方案ppt模板下载资讯类网站源码