📅  最后修改于: 2023-12-03 14:43:43.385000             🧑  作者: Mango
给定一个整数数组nums和一个整数K,你需要删除最多K个数字,使得剩余元素的和最大。
一种简单的解决方案是使用动态规划。定义一个二维数组dp,其中dp[i][j]表示删除了j个数字后,前i个数字的最大总和。
则状态转移方程为:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]+nums[i])
其中,dp[i-1][j-1]+nums[i]表示删除i这个数字,并在之前删除j-1个数字的最大总和。
最终结果为dp[n][K],其中n为数组长度。
时间复杂度为O(nK),空间复杂度为O(nK)。
def deleteAndEarn(nums, k):
n = len(nums)
dp = [[0 for _ in range(k+1)] for _ in range(n+1)]
for i in range(1, n+1):
for j in range(1, k+1):
dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]+nums[i-1])
return dp[n][k]
nums = [1,2,3,4,5], k = 2
删除3和5,剩下的数字为[1,2,4],最大总和为7。
nums = [2,2,3,3,3,4], k = 3
删除2个3和一个2,剩下的数字为[3,3,4],最大总和为10。