這道題和打家劫舍得思路很像。
思路:首先我們看到題目的意思,就是說我們如果選擇了一個數,那么它相鄰的數就會不得選入,也就是刪除。這就是上一個題那個相鄰的家不能偷的問題唄!
我們從那個地方轉換一下,也就是說,我們現在選擇的數就是用來偷竊財產的房間號,只不過這個時候房間號相同的個數增加了,不是一個了,所以我們需要計數。由于給出的樣例里面數都是相鄰的,所以我們需要排個序,因為順序可能是不一樣的,這樣不會影響結果。
接下來就按照上一道題的思路寫dp的轉移方程就行。
注意:首先就是數組的大小開多大的問題,就是按照數據范圍開就行。然后,注意盡量不要用nums[i],你可能會漏了判斷n的個數是多少,導致出現數組越界的錯誤。所以,我們就直接用循環中的i代替就行,因為反正排完序之后順序就是一樣的,數字也是相鄰的,所以我們直接用循環變量代替就行了。
上代碼:
class Solution {
public:int deleteAndEarn(vector<int>& nums) {sort(nums.begin(),nums.end());int maxs=nums.back();vector<int>dp(10001,0);vector<int>count(10001,0);for(int val:nums)count[val]++;dp[1]=count[1];for(int i=2;i<=maxs;i++){dp[i]=max(dp[i-1],dp[i-2]+i*count[i]);}return dp[maxs];}
};