学习目标:
用于记录每日刷的题目为了明年的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.写完了最优子结构只要把基准条件确立就能解决问题,最后来实现代码
代码实现:
或者