给你一个整数数组 nums ,你可以对它进行一些操作。

每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除每个等于 nums[i] - 1 或 nums[i] + 1 的元素。

开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。

示例 1:

输入:nums = [3,4,2]
输出:6
解释:
删除 4 获得 4 个点数,因此 3 也被删除。
之后,删除 2 获得 2 个点数。总共获得 6 个点数。

解题思路

代码分为两个部分

  1. 统计每个元素出现的次数(方便计算删除元素后的得分),并且找出最大值(为了缩小dp数组的长度)
 for _, num := range nums {cnt[num]++if num>max{max=num}}
  1. 状态转移
    dp[i][0]代表当前元素是i,并且不删除该元素。因此前一个元素可以是被删除元素,也可以不是
    dp[i][1]代表当前元素是i,需要删除该元素。因此前一个元素必须不为删除元素(因为如果前一个元素是删除元素,该元素已经被删除掉了),并且加上删除后的得分
 for i := 1; i <= max; i++ {dp[i][0]=MaxV(dp[i-1][0],dp[i-1][1])dp[i][1]=dp[i-1][0]+i*cnt[i]}

代码

func MaxV (a int,b int) int {if a>b{return a}else {return b}
}func deleteAndEarn(nums []int) int {cnt:=make([]int,10008)max:=-1for _, num := range nums {cnt[num]++if num>max{max=num}}dp:=make([][2] int,max+1)for i := 1; i <= max; i++ {dp[i][0]=MaxV(dp[i-1][0],dp[i-1][1])dp[i][1]=dp[i-1][0]+i*cnt[i]}return MaxV(dp[max][0],dp[max][1])
}

leetcode 740. 删除并获得点数(dp)相关推荐

  1. leetcode - 740. 删除与获得点数

    740. 删除与获得点数 -------------------------------------------- 给定一个整数数组 nums ,你可以对它进行一些操作. 每次操作中,选择任意一个 n ...

  2. LeetCode 740. 删除与获得点数(排序+动态规划)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个整数数组 nums ,你可以对它进行一些操作. 每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数.之后,你必须删除 ...

  3. [leetcode] 740.删除并获得点数

    给你一个整数数组 nums ,你可以对它进行一些操作. 每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数.之后,你必须删除 所有 等于 nums[i] - 1 和 nu ...

  4. leetcode 740. Delete and Earn | 740. 删除并获得点数(暴力递归->傻缓存->DP)

    题目 https://leetcode.com/problems/delete-and-earn/ 题解 建立 help 数组,相当于一个(正向)索引表. 先排序,因为删除的顺序不影响最优结果(实际上 ...

  5. 【LeetCode】LeetCode之删除并获得点数——动态规划、排序+动态规划

  6. 动态规划——删除并获得点数(Leetcode 740)

    题目选自Leetcode 740. 删除并获得点数 这道题和打家劫舍其实很类似,只不过因为这道题给的原始数组其实对于元素的值和位置来说并不是连续的,所以我们可以将其转化为统计出每个数字的值,然后进行& ...

  7. LeetCode 486. 预测赢家(博弈DP)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个表示分数的非负整数数组. 玩家 1 从数组任意一端拿取一个分数,随后玩家 2 继续从剩余数组任意一端拿取分数,然后玩家 1 拿,-- . 每次一个 ...

  8. [链表|多解法] leetcode 19 删除链表的倒数第N个节点

    [链表|多解法] leetcode 19 删除链表的倒数第N个节点 1.题目 题目链接 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2-&g ...

  9. C++描述 LeetCode 26. 删除排序数组中的重复项

    C++描述 LeetCode 26. 删除排序数组中的重复项   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写博客 ...

最新文章

  1. CSS------li中的宽和高无法修改问题
  2. UpdateData使用简介
  3. LVS(5)——关于ipvsadm第一次启动失败的原因
  4. SAP CRM WebClient UI运行时加载哪个configuration,到底是如何决定的
  5. Java面试题及答案,java入门书籍
  6. JavaScript算法(实例六)输出日期 / 数组合并 / 小球下落--反弹运动
  7. springboot 事务嵌套问题_在springboot中写单元测试解决依赖注入和执行后事务回滚问题...
  8. poj2176 Folding
  9. 两轮小车相关记录(重点)
  10. AnyForWeb告诉你什么才是“最好的”编程语言
  11. 打开注册表regedit
  12. 自动抢某投资公司的理财产品预购
  13. python中求差的函数_python3函数取差是什么?如何写代码?
  14. SQLite 对时间的支持
  15. Mysql-Cluster 集群部署
  16. 如何优雅的使用C语言绘制一只小猪佩奇
  17. ETL工程师 2021-11-14
  18. MySql 别犯糊涂了! LEFT JOIN 的 ON 后接上筛选条件,多个条件会出事!
  19. javascript Date属性(月份英语)
  20. 如何创建自定义maven archetype?

热门文章

  1. 聊聊gcc参数中的-I, -L和-l
  2. C++里数组名+1和数组名的地址+1的区别
  3. 计算机网络与网站设计知识点,计算机网络技术知识点总结-20210525075410.docx-原创力文档...
  4. pose estimation papers and datasets
  5. java学习笔记11 (构造方法 this深探)
  6. 被未知进程占用端口的解决办法
  7. ESFramework介绍之(23)―― AgileTcp
  8. RUNOOB python练习题13 水仙花数
  9. 2.2 string
  10. 开源一个爬取redmine数据的测试报告系统