题目大意:给出整数数组nums,每当取出一个数时,比它大一和小一的数都会从数组中被删掉,问取出的数的最大总和
分析:动规。和之前的leetcode198有联系。由于对于几个相同的数值i,要么全取出,要么全删除,所以我们将每个数值i都作为新数组house的下标,新数组就是代表了每个房子的价值(数值为i的数字总和就是房子i的价值),取了i就不能取i+1和i-1,也就是我们不能取相邻的两个房子。后面就是抢房子的动规思想了。
代码:
class Solution {
public:
int deleteAndEarn(vector<int>& nums) {
if(nums.size() == 0) return 0;
int len = 0;
for(int num : nums){ //确定新数组空间
len = max(len,num);
}
vector<int> house(len + 1); //更新房子价值
for(int num : nums){
house[num] += num;
}
vector<int> dp(len + 1);
dp[1] = house[1];
for(int i = 2;i <= len;i++){
dp[i] = max(dp[i - 1],dp[i - 2] + house[i]);
}
return dp[len];
}
};