思路——(打家劫舍4?)
一开始看到左右都受影响就想到了Leetcode-312 戳气球,但是后来才发现这就是
打家劫舍
鸭!!!
只要你选用了a,那么a-1和a+1都和你无关了,那么肯定是要贪心的选全部的a才对得起损失。
问题转化为对于每一个元素,不能选它的临近值(不能偷隔壁),联动成功!
具体代码
1.将nums数组最大值求出mm
2.开一个mm+1大小的value数组,value[mm]表示mm的个数
3.dp计算打家劫舍,递推dp[i]=max(dp[i-2]+i*value[i],dp[i-1]);
代码
class Solution {
public:
int deleteAndEarn(vector<int>& nums) {
if(nums.size()==0) return 0;
if(nums.size()==1) return nums[0];
int mm=0;
for(int i=0;i<nums.size();i++)
{
mm=max(mm,nums[i]);
}
vector<int> value(mm+1,0);
for(int i=0;i<nums.size();i++)
{
value[nums[i]]++;
}
vector<int> dp(value.size(),0);
dp[0]=0;
dp[1]=value[1];
for(int i=2;i<value.size();i++)
{
dp[i]=max(dp[i-2]+i*value[i],dp[i-1]);
}
return dp[dp.size()-1];
}
};