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];
    }
};
posted @ 2021-05-05 21:26  andymori  阅读(61)  评论(0)    收藏  举报