牛客 DP25 删除相邻数字的最大分数

题目描述

 方法:

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])

                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值