740. 删除并获得点数
740. 删除并获得点数
给你一个整数数组 nums ,你可以对它进行一些操作。
每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除每个等于 nums[i] - 1 或 nums[i] + 1 的元素。
开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
示例 1:
输入:nums = [3,4,2]
输出:6
解释:
删除 4 获得 4 个点数,因此 3 也被删除。
之后,删除 2 获得 2 个点数。总共获得 6 个点数。
动态规划
- 首先新建一个map用来存储数组的点数;
- dp[i]表示小于等于点数\(i\)的最大点数,不同点数的数目等于map的size
- 更新规则:当点数\(i-1\)不在map中时,此时直接加入\(i\),不需要删除;当\(i-1\)在map中时,要决定是加入\(i-1\)还是加入\(i-2\)和\(i\)
class Solution {
public:
int deleteAndEarn(vector<int>& nums) {
// dp[i]:表示前i个的最大点数
// map:存储nums的数值和点数
map<int, int> mymap;
for(auto num: nums){
mymap[num] += num;
}
int m = mymap.size();
vector<int> dp(m, 0);
auto iter = mymap.begin();
dp[0] = iter->second;
for(int i = 1; i < m; ++i){
iter++;
if(mymap.count(iter->first - 1)){
if(i == 1)
dp[i] = max(dp[i-1], iter->second);
else
dp[i] = max(dp[i-2] + iter->second, dp[i-1]);
}
else
dp[i] = dp[i-1] + iter->second;
}
return dp[m-1];
}
};

浙公网安备 33010602011771号