题目链接:leetcode740
思路:
根据题目给的数据范围,可以进行DP, d p [ i ] dp[i] dp[i]表示删除从1~i中存在的数中删除i这个数后的最大收益,显然数组中有几个i就能获得 i ∗ k i*k i∗k的收益。于是可以利用计数排序。状态转移方程: d p [ i ] = m a x ( d p [ i − 1 ] , d p [ i − 2 ] + i ∗ k ) dp[i]=max(dp[i-1],dp[i-2]+i*k) dp[i]=max(dp[i−1],dp[i−2]+i∗k),解释:删除了i后显然i-1的贡献得不到了,只能得到i-2的贡献,比较两者的最大值即可。
class Solution {
public:
int deleteAndEarn(vector<int>& nums) {
vector<int> vis(10001, 0);
vector<int> dp(10001, 0);
int n=nums.size(), ans=0;
for(int i=0; i<n; i++) vis[nums[i]]++;
if(vis[1]) ans=dp[1]=vis[1];
for(int i=2; i<=10000; i++) {
dp[i]=max(dp[i-2]+vis[i]*i, dp[i-1]);
ans=max(ans, dp[i]);
}
return ans;
}
};