leetcode 740. 删除并获得点数

凭着感觉,莫名其妙迷迷糊糊地就通过了,自己也不知道怎么就过了,以下是题解的评论
// 每个位置上的数字是可以在两种前结果之上进行选择的:
// 1.如果你不删除当前位置的数字,那么你得到就是前一个数字的位置的最优结果。
// 2.如果你觉得当前的位置数字i需要被删,那么你就会得到 i - 2位置的那个最优结果加上当前位置的数字乘以个数。
// 以上两个结果,每次取最大的,记录下来,然后答案就是最后那个数字了。
class Solution {
public:
int deleteAndEarn(vector<int>& nums) {
int maxNum = *(max_element(nums.begin(), nums.end()));
vector<int> countNum(maxNum + 1);
for(int &num : nums) ++countNum[num];
vector<int> dp(maxNum + 1);//dp[i]代表直到 数字 i 所能得到的最大点数
if(countNum[1] != 0){
dp[1] = countNum[1];
}
for(int i = 2;i <= maxNum;++i){
dp[i] = max(i * countNum[i] + dp[i - 2],dp[i - 1]);
}
return dp[maxNum];
}
};
浙公网安备 33010602011771号