Leetcode:740. Delete and Earn

来源:互联网 发布:淘宝微淘话题在哪里找 编辑:程序博客网 时间:2024/05/18 05:07

Description

这里写图片描述

解题思路

挑选任意一个数字nums[i],得到nums[i]分,同时需要删除所有等于nums[i] - 1和nums[i] + 1的整数。求最大得分。

用动态规划(Dynamic Programming)求解
dp[x]表示删除不大于x的所有数字的最大得分。c[x]存储数字x的个数。
状态转移方程:
dp[x] = max(dp[x - 1], dp[x - 2] + c[x] * x)

class Solution {public:    int deleteAndEarn(vector<int>& nums) {        if(nums.size() == 0) return 0;        vector<int> c(10001,0);        for (int i = 0; i < nums.size(); i++) ++c[nums[i]];        vector<int> dp(c.size()+1,0);        dp[1] = c[1]*1;        for(int i =2; i <= 10000;i++) {            dp[i] = max(dp[i-1],dp[i-2]+c[i]*i);        }        return dp[10000];    }};
原创粉丝点击