• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Niro Einteson
文可提笔安天下 武可上马定乾坤
博客园    首页    新随笔    联系   管理    订阅  订阅

740. 删除与获得点数

740. 删除与获得点数

 

给定一个整数数组 nums ,你可以对它进行一些操作。

每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除每个等于 nums[i] - 1 或 nums[i] + 1 的元素。

开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。

示例 1:

输入: nums = [3, 4, 2]
输出: 6
解释: 
删除 4 来获得 4 个点数,因此 3 也被删除。
之后,删除 2 来获得 2 个点数。总共获得 6 个点数。

示例 2:

输入: nums = [2, 2, 3, 3, 3, 4]
输出: 9
解释: 
删除 3 来获得 3 个点数,接着要删除两个 2 和 4 。
之后,再次删除 3 获得 3 个点数,再次删除 3 获得 3 个点数。
总共获得 9 个点数。

注意:

  • nums的长度最大为20000。
  • 每个整数nums[i]的大小都在[1, 10000]范围内。

 

 1 class Solution {
 2 public:
 3     int deleteAndEarn(vector<int>& nums) {
 4         //选择任意一个元素nums[i]就要删除所有的nums[i] - 1 或者nums[i] + 1,这其实就意味着如果我们选择了nums[i] 就不能选择任何与之相邻的元素
 5         vector<int> dp(10001),data(10001);//默认初始化为0
 6         for(int i=0;i<nums.size();i++){
 7             data[nums[i]]+=nums[i];//桶排序:将相同的值相加
 8         }
 9         dp[0]=0;
10         dp[1]=data[1];
11         for(int i=2;i<data.size();i++){//打家劫舍问题,只不过中间有的值为0,如0,0,2,0,0,23....
12             dp[i]=max(dp[i-1],data[i]+dp[i-2]);
13         }
14         return dp[data.size()-1];
15     }
16 };

  

 1 class Solution {
 2 public:
 3     int deleteAndEarn(vector<int>& nums) {
 4         vector<int> dp(10001, 0);
 5         for(int i : nums)
 6             dp[i]++;//代表 i 的数有 dp[i]个
 7         for(int i = 2; i < 10001 ;i++){
 8             dp[i] = max(dp[i-2]+dp[i]*i, dp[i-1]);
 9         }
10         return dp[10000];
11     }
12 };

 

posted @ 2020-03-18 20:53  Nirogo  阅读(288)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3