统计每个值所能获得的点数
dp 从终态考虑转移方程!!!
dp[i][0]表示第i个数保留
dp[i][1]表示删除第i个数
dp[n][0] = dp[n - 1][1];
dp[n][1] = max(dp[n - 2][0], dp[n - 2][1]) + a[n];
class Solution { public: int dp[20010][2]; int num[20010]; int deleteAndEarn(vector<int>& nums) { memset(dp, 0, sizeof(dp)); memset(num, 0, sizeof(num)); int n = nums.size(); for(int i = 0; i < n; i++) { if(num[nums[i]] == 0) num[nums[i]] = nums[i]; else num[nums[i]] += nums[i]; } dp[1][0] = 0; dp[1][1] = num[1]; for(int i = 2; i <= 20000; i++) { dp[i][0] = dp[i - 1][1]; dp[i][1] = max(dp[i - 2][0], dp[i - 2][1]) + num[i]; } return max(dp[20000][0], dp[20000][1]); } };