------
## 最终结论
```python
def maxSumAfterPartitioning(arr, k):
    n = len(arr)
    dp = [0] * n  # 创建动态规划数组

    # 初始化 dp[0]
    dp[0] = arr[0]

    # 遍历数组计算最大和
    for i in range(1, n):
        max_value = arr[i]
        for j in range(1, min(k, i + 1) + 1):  # j 为子数组的长度
            max_value = max(max_value, arr[i - j + 1])  # 更新当前子数组的最大值
            if i - j >= 0:
                dp[i] = max(dp[i], dp[i - j] + max_value * j)  # 更新 dp[i]
            else:
                dp[i] = max(dp[i], max_value * j)  # 如果没有前面的元素，直接使用最大值

    return dp[n - 1]  # 返回结果
```