【刷题笔记】——day.1删除并获得点数

学习目标:

用于记录每日刷的题目为了明年的python组蓝桥杯做准备,今天是打卡的第一天,冲!


 原题:删除并获得点数

题目描述:

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

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

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

示例1:

输入:nums = [5,4,6]

输出:10

解释:先删除6,获得6个点数,因此删除数字5。而后再删除4,获得4个点数。所以最大获得了6+4 = 10个点数

示例2:

输入: nums = [2,2,3,3,3,4]

输出:9

解释:先删除数字2,获得3个点数,因而数字2和4全部被删除。而后再删除3,再删除3。所以最后一共获得了3+3+3 = 9个点数



题解:

思路(动态规划)

1.首先我们先创建一个列表,列表中用于储存下标出现的次数,比如对于示例二,我们创建一个 count = [0,0,2,3,1] 的列表,这既起到了计数的作用又间接的将nums进行了排序。


2.然后,我们来想如何将这个问题划分为子问题,我们明确一个概念,对于第 i 个位子上的数有两种前结果之上进行选择的:

        I.如果我选择不删除当前位子的数,那么你就得到的是 i -1 的位子的最优结果

        II.如果我选择删除了当前位子的数,那么前一个位子的数就被删除,所以得到的结果就是 i - 2 的位子的最优结果 + 当前位子的数 * 当前位子的数的个数

因此我们可以写出这样的递推公式 dp[ i ] = max(dp[i - 1],dp[i - 2] + count[ i ] * i)


3.写完了最优子结构只要把基准条件确立就能解决问题,最后来实现代码


代码实现:

 或者

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

澄某人呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值