Leetcode(1043)分隔数组以得到最大和

本文详细解析LeetCode中的1043题,探讨如何通过动态规划策略,将数组分割成长度不超过k的子数组,以求得最大和。通过分析初始数组arr和k值,提出动态规划状态转移方程,并强调在计算过程中需要注意的边界条件和循环范围问题。
摘要由CSDN通过智能技术生成

Leetcode(1043)分隔数组以得到最大和

Leetcode题目+源解释

题目

*初始数组 arr = [1,15,7,9,2,5,100] k=3
dp[i] 表示前i个元素分割为长度小于k的连续子数组,分隔变换后能够得到的元素最大和。
那么我们从0开始推导
dp[0]=1
dp[1]=30
dp[2]=45
很容易看出,元素个数小于k的时候,直接找数组最大值,乘上元素个数即可。
那么我们接着看第k个元素。
dp[3]=?
由于题目要求的是,子数组元素个数不大于k。那么跟arr[3]在一个分组的情况一共有k种
(arr[3])
(arr[3],arr[2])
(arr[3],arr[2],arr[1])
那么,我们计算dp[3]只需要计算出比较这k种组合的最大值即可。
那么我们可以得到归纳方程
dp[n]=max(dp[n-1]+max(arr[n])*1, dp[n-2]+max(arr[n], arr[n-1])*2, … , dp[n-k]+max(arr[n], arr[n-k+1])*k);
这里我们可以用个循环实现
for i in range(1,k):
dp[n] = max(dp[n], dp[n-i]+max(arr[n], arr[n-i+1])*i);

需要注意的几个问题

1.就是从(1,k)的for循环,因为dp的精髓就是我们只需要关注当下dp[i]或者说是arr[i]和之前的数据dp[i-某],不需要考虑后面的dp[i+某],所以对于(1,k)最为简单就是[0,i]种最大的一个元素*个数;

2.从[k,n)我们需要关注的就是要进行比较也就是同国for(int j=1;j<=k;j++)这个循环来控制;

3.还有一个重要的就是边界条件是i-j还是i-j+1,是<k还是<k+1这都需要考虑的,边界值对于这种题目影响很大。

class Solution {
   
    #
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值