uacs2024

导航

leetcode 740. 删除并获得点数

740. 删除并获得点数

凭着感觉,莫名其妙迷迷糊糊地就通过了,自己也不知道怎么就过了,以下是题解的评论

// 每个位置上的数字是可以在两种前结果之上进行选择的:
// 1.如果你不删除当前位置的数字,那么你得到就是前一个数字的位置的最优结果。
// 2.如果你觉得当前的位置数字i需要被删,那么你就会得到 i - 2位置的那个最优结果加上当前位置的数字乘以个数。
// 以上两个结果,每次取最大的,记录下来,然后答案就是最后那个数字了。
class Solution {
public:
    int deleteAndEarn(vector<int>& nums) {
        int maxNum = *(max_element(nums.begin(), nums.end()));
        vector<int> countNum(maxNum + 1);
        for(int &num : nums)  ++countNum[num];
        vector<int> dp(maxNum + 1);//dp[i]代表直到 数字 i 所能得到的最大点数
        if(countNum[1] != 0){
            dp[1] = countNum[1];
        }
        for(int i = 2;i <= maxNum;++i){
            dp[i] = max(i * countNum[i] + dp[i - 2],dp[i - 1]);
        }
        return dp[maxNum];
    }
};

 

posted on 2024-12-29 14:32  ᶜʸᵃⁿ  阅读(37)  评论(0)    收藏  举报