删除并获得点数

另类打家劫舍问题:
选择第i个数, 那么i+1, 和i-1都不可以选
对nums数列进行木桶排序,
dp[i]= max(dp[i - 2] + cnt[i] * i, dp[i - 1])
//选择上两个数, 那么这个数就可以选, 选择上一个数, 那么这个数就不能选了

const int N = 1e4 + 10;
class Solution {
public:
    int deleteAndEarn(vector<int>& nums) {
        int n =  nums.size();
        vector<int> cnt(N, 0);
        for(int i = 0; i < n; i ++)
        {
            cnt[nums[i]] ++;
        }
        vector<int> dp(N, 0);
        dp[1] = cnt[1];
        int res = 0;
        for(int i = 2; i < N; i ++)
        {
            dp[i] = max(dp[i - 2] + cnt[i] * i, dp[i - 1]);
            res = max(res, dp[i]);
        }
        return res;
    }
};
posted @ 2021-08-10 10:42  梨花满地  阅读(92)  评论(0)    收藏  举报