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];
}
};