原题链接:https://leetcode-cn.com/problems/delete-and-earn/
相关题目:打家劫舍
以nums数组最大的数来作为字典的最大索引,比如最大数为max,那么字典的范围就是从1到max,这样如果字典中索引不在nums数组里就置0,转换为了不能取相邻两个数,就可以用打家劫舍的方法来做了。
dp[i]表示nums[:i]获得最大的点数
状态转移
dp[i]=max(dp[i-1],dp[i-2]+dict[i]*i);
是不是和打家劫舍很像了,结果就是dp[max_num]。
int deleteAndEarn(vector<int>& nums) {
if(nums.empty()) {
return 0;
}
int max_num=INT_MIN;
for(auto num:nums){
max_num=max(max_num,num);
}
vector<int> dict(max_num+1,0);
for(auto num:nums){
dict[num]++;
}
vector<int> dp(max_num+1,0);
dp[1]=dict[1];
for(int i=2;i<=max_num;i++){
dp[i]=max(dp[i-1],dp[i-2]+dict[i]*i);
}
return dp[max_num];
}