题目描述
方法:
1. 递归遍历生成
nums = [1,2,3,2,2]*1
s = 0
scores = []
def recur(nums, score):
if not nums:
scores.append(score)
for i, num in enumerate(nums):
ss = score
newnums = nums.copy()
ss += num
newnums.remove(num)
for tmp in nums:
if tmp == num + 1 or tmp == num - 1:
newnums.remove(tmp)
recur(newnums, ss)
recur(nms, s)
print(max(scores))
2. 排序后,从大开始判断,看nums[-1]和nums[-1]-1和nums[-1]-2的个数关系
nums = [1,2,3,2,2]*1
s = 0
nms.sort()
while nms:
cur = nms[-1]
if (cur - 1) not in nms:
s += nms.pop()
elif nms.count(cur-1) <= nms.count(cur) + nms.count(cur-2):
while nms and nms[-1] == cur:
s += nms.pop()
while nms and nms[-1] == cur-1:
nms.pop()
elif nms.count(cur-1) > nms.count(cur) + nms.count(cur-2):
while nms and nms[-1] == cur:
nms.pop()
while nms and nms[-1] == cur-1:
s += nms.pop()
while nms and nms[-1] == cur-2:
nms.pop()
print(s)
缺点:前两种方法都会超时
3. 动态规划
统计数字个数:用cnt的下标代表数字,值代表个数
状态转移: dp[i] = max(dp[i-1], dp[i-2] + cnt[i] * i)
nums = [1,2,3,2,2]*1
m = max(nums)
cnt = [0 for i in range(m+1)]
for num in nums:
cnt[num] += 1
res = 0
dp = [0 for i in range(m+1)]
dp[1] = cnt[1]
for i in range(m+1):
dp[i] = max(dp[i-1], dp[i-2] + cnt[i] * i)
print(dp[-1])