当前位置: 面试刷题>> 数组最大价值 (经典算法题500道)


### 题目描述补充 **题目:数组最大价值** 给定一个整数数组`arr`和一个整数`k`,你可以从中选择最多`k`个不相邻的元素。被选择的元素的和即为数组的最大价值。请编写一个函数来计算这个最大价值。 **示例 1**: ``` 输入: arr = [1, 3, 1, 15, 5, 2, 6], k = 3 输出: 23 解释: 选择索引为 1, 3 和 5 的元素,这些元素的和为 3 + 15 + 2 = 20。 但是,如果我们选择索引为 1, 3 和 4 的元素,和为 3 + 15 + 5 = 23,这是最大的。 ``` **示例 2**: ``` 输入: arr = [2, 4, 6, 2, 5], k = 2 输出: 11 解释: 选择索引为 1 和 4 的元素,和为 4 + 5 = 11。 ``` ### PHP 示例代码 ```php function maxSumAfterPartitioning($arr, $k) { $n = count($arr); if ($k >= $n) { return array_sum($arr); // 如果k大于等于数组长度,直接返回数组总和 } // dp[i][j] 表示在前i个元素中选择j个不相邻元素的最大价值 $dp = array_fill(0, $n + 1, array_fill(0, $k + 1, 0)); for ($i = 1; $i <= $n; $i++) { for ($j = 1; $j <= $k; $j++) { // 不选当前元素,继承前一个状态 $dp[$i][$j] = $dp[$i - 1][$j]; // 如果j > 0,可以选择当前元素(但需要跳过前一个元素) if ($i > 1) { $dp[$i][$j] = max($dp[$i][$j], $dp[$i - 2][$j - 1] + $arr[$i - 1]); } } } return $dp[$n][$k]; } // 测试代码 $arr = [1, 3, 1, 15, 5, 2, 6]; $k = 3; echo maxSumAfterPartitioning($arr, $k); // 输出 23 ``` ### Python 示例代码 ```python def maxSumAfterPartitioning(arr, k): n = len(arr) if k >= n: return sum(arr) # 如果k大于等于数组长度,直接返回数组总和 # dp[i][j] 表示在前i个元素中选择j个不相邻元素的最大价值 dp = [[0] * (k + 1) for _ in range(n + 1)] for i in range(1, n + 1): for j in range(1, k + 1): dp[i][j] = dp[i - 1][j] # 不选当前元素 if i > 1: dp[i][j] = max(dp[i][j], dp[i - 2][j - 1] + arr[i - 1]) # 如果j > 0,可以选择当前元素 return dp[n][k] # 测试代码 arr = [1, 3, 1, 15, 5, 2, 6] k = 3 print(maxSumAfterPartitioning(arr, k)) # 输出 23 ``` ### JavaScript 示例代码 ```javascript function maxSumAfterPartitioning(arr, k) { const n = arr.length; if (k >= n) { return arr.reduce((sum, val) => sum + val, 0); // 如果k大于等于数组长度,直接返回数组总和 } // dp[i][j] 表示在前i个元素中选择j个不相邻元素的最大价值 const dp = Array.from({ length: n + 1 }, () => Array(k + 1).fill(0)); for (let i = 1; i <= n; i++) { for (let j = 1; j <= k; j++) { dp[i][j] = dp[i - 1][j]; // 不选当前元素 if (i > 1) { dp[i][j] = Math.max(dp[i][j], dp[i - 2][j - 1] + arr[i - 1]); // 如果j > 0,可以选择当前元素 } } } return dp[n][k]; } // 测试代码 const arr = [1, 3, 1, 15, 5, 2, 6]; const k = 3; console.log(maxSumAfterPartitioning(arr, k)); // 输出 23 ``` **码小课网站中有更多相关内容分享给大家学习**,包括更多算法题解析、编程技巧等。
推荐面试题