数组分隔变化后的最大和问题 | 豆包MarsCode AI刷题

53 阅读1分钟

问题描述

小F希望将一个整数数组 arr 分隔成若干连续的子数组,每个子数组的长度最多为 k,并且每个子数组的所有元素都变为该子数组中的最大值。目标是找到一种分隔方式,使得分隔后的数组和最大化。我们的任务是在动态规划的基础上,从数组前向后递推,找到能产生最大和的分隔方式。

问题分析

设 dp[i] 表示将数组前 i 个元素分隔后得到的最大和。对于每个位置 i,我们可以选择最后一个子数组的长度为 1 到 k 之间的任意值。

为了计算 dp[i],我们考虑最后一个子数组的长度为 l,此时最后一个子数组包含 arr[i-l+1] 到 arr[i] 之间的元素,其值全部变为其中的最大值 max_val。

其中:

*dp[i-l] 是将数组的前 i-l 个元素分隔后的最大和。

max_val 是从 arr[i-l+1] 到 arr[i] 之间的最大值。

l 是子数组的长度,取值范围是 1 \leq l \leq k,并且 i-l+1 \geq 0。 *

dp[0] 表示没有元素时的最大和,显然为 0。最终我们要计算的是 dp[n],其中 n 是数组的长度。

代码实现

def solution(arr, k):
    n = len(arr)
    dp = [0] * (n + 1) 
    
    for i in range(1, n + 1):
        max_val = 0
        for l in range(1, min(k, i) + 1):
            max_val = max(max_val, arr[i - l]) 
            dp[i] = max(dp[i], dp[i - l] + max_val * l)
    
    return dp[n]