1.题目
2.代码+(一丢丢解析)
说实话,实在没想到能击败80%的用户,在内存上居然也击败了70%,我感觉我申请了一个比较大的空间。
我申请了一个Max+1大小的数组(单纯不想每次-1),Max是nums数组中的最大值,通过该数组实现下面的状态转移。
1 | 2 | 3 | 4 | 5 | 6 |
+dp[1] | +(dp[1],dp[2]中的最大值) | +(dp[2],dp[3]中的最大值) | +(dp[3],dp[4]中的最大值) |
class Solution {
public:
int deleteAndEarn(vector<int>& nums) {
sort(nums.begin(),nums.end());
int n=nums.size();
int Max=nums.back();
//1.初始化
vector<int> dp(Max+1,0);
for(int i=0;i<n;i++) dp[nums[i]]+=nums[i];
//2.特殊情况
if(Max==1) return dp[1];
if(Max==2) return max(dp[1],dp[2]);
//3.一般情况
dp[3]+=dp[1];
for(int i=4;i<=Max;i++) dp[i]+=max(dp[i-2],dp[i-3]);
return max(dp[Max],dp[Max-1]);
}
};