动态规划入门题目| MarsCode

动态规划入门题目| MarsCode
Beaten196 小M的得分挑战
问题描述
小M有一个长度为 n 的数组 a,初始分数为 0。
小M每次可以选择两个整数,并且这两个数的差值不能超过 k。小M会获得这两个数的乘积作为分数,并且已经被选择过的数不能再被选择。
你需要帮助小M计算,最多能获得多少分数?
测试样例
样例1:
输入:
n = 6, k = 2, a = [1, 1, 4, 5, 1, 4]
输出:21
样例2:
输入:
n = 4, k = 1, a = [3, 3, 4, 4]
输出:25
样例3:
输入:
n = 5, k = 0, a = [2, 2, 2, 2, 2]
输出:8
思路解析
排序数组: 为了方便配对,我们首先将数组
a按升序排序。这有助于我们更容易地找到符合条件的配对。定义DP数组: 定义一个 DP 数组
dp,其中dp[i]表示前i个元素能够获得的最大分数。状态转移: 对于每一个位置
i,有两种选择:- 不配对第
i个元素:则dp[i] = dp[i-1]。 - 配对第
i个元素与第i-1个元素(如果它们的差值不超过k):则dp[i] = dp[i-2] + a[i-1] * a[i-2]。
我们取这两种选择中的最大值作为
dp[i]的值。- 不配对第
边界条件:
dp[0] = 0:没有元素时,分数为0。dp[1] = 0:只有一个元素时,无法配对,分数为0。
最终结果: 最终的最大分数为
dp[n]。
1 | def solution(n: int, k: int, a: list) -> int: |




