前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode刷题DAY 30:删除与获得点数

LeetCode刷题DAY 30:删除与获得点数

作者头像
三猫
发布2020-06-19 12:14:25
3770
发布2020-06-19 12:14:25
举报

1

题目描述

给定一个整数数组 nums ,每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数,同步删除每个等于 nums[i] - 1 或 nums[i] + 1 的元素。初始点数为0,返回可获得的最大点数。如:nums=[3,4,2],返回6。(首先选择4,积累4点数,同时删除3,再选择2,再积累2点数,总共为6。其他方式积累的点数均小于6)

2

题解

思路:动态规划

通过题目要求,首先要明确一点是:当选择了一个值获得其点数,则其他相同的值也会选择。因为当选择一个值时,相邻值已被删除,因此其他相同的值不会被删除,一定会选择到。因此可以建立一个列表value,以值作为下标,记录选择每个值时对应可获得的点数。如:[2,2,3,3,4],value[2]=2*2,value[3]=3*2,value[4]=4*1,所以最后得到value=[0,0,4,6,4]。

  • 中间状态:此处中间状态dp[i]表示从1选择到i可获得的最大点数。
  • 状态转移:一个值在整个过程中只有被删除和被获取点数两个可能,并且获取与否会影响其他数值的被选择情况。因此新来一个数,要么不选,则此时dp[i]=dp[i-1];如果选,则i-1就不能选,此时dp[i]=dp[i-2]+value[i],所以最终dp[i]=max(dp[i-1],dp[i-2]+value[i])。
代码语言:javascript
复制
class Solution:
    def deleteAndEarn(self, nums: List[int]) -> int:
        if not nums:
            return 0
        dp = [0]*(max(nums)+1)
        value = dp.copy()
        #value = [0]*(max(nums)+1)
        for i,a in enumerate(nums):
            value[a]+=a
        dp[1] = value[1]
        for i in range(2,max(nums)+1):
            dp[i]=max(dp[i-1],dp[i-2]+value[i])
        return dp[-1]
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习养成记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档