日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 740. 删除与获得点数(排序+动态规划)

發布時間:2024/7/5 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 740. 删除与获得点数(排序+动态规划) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

給定一個整數數組 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 個點數,接著要刪除兩個 24 。 之后,再次刪除 3 獲得 3 個點數,再次刪除 3 獲得 3 個點數。 總共獲得 9 個點數。注意: nums的長度最大為20000。 每個整數nums[i]的大小都在[1, 10000]范圍內。

來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/delete-and-earn
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

  • 先預處理出每個數字的分數,并且按數字排序,使用map
  • dp[i][0] 表示不拿, dp[i][1] 表示拿 i 號數字時的最大得分
class Solution { public:int deleteAndEarn(vector<int>& nums) {if(nums.empty())return 0;map<int,int> num_points;for(int num : nums)num_points[num] += num;//數字和其對應的分數vector<pair<int,int>> num_pts(num_points.begin(), num_points.end());//map key有序vector<vector<int>> dp(num_points.size(), vector<int>(2, 0));// dp[i][0] 表示不拿, dp[i][1] 表示拿 i 號數字的最大得分dp[0][1] = num_pts[0].second;//拿第一個數的得分for(int i = 1; i < num_pts.size(); ++i){if(num_pts[i-1].first+1 < num_pts[i].first)//數字間隔大于1dp[i][1] = num_pts[i].second + max(dp[i-1][0], dp[i-1][1]);//前一個數可以拿或者不拿else // num_pts[i-1].first+1 == num_pts[i].first 間隔1//我要拿了,前一個不能拿dp[i][1] = num_pts[i].second + dp[i-1][0];dp[i][0] = max(dp[i-1][0], dp[i-1][1]); //我不拿,那么前一個拿或者不拿}return max(dp.back()[0], dp.back()[1]);} };

20 ms 10.4 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

總結

以上是生活随笔為你收集整理的LeetCode 740. 删除与获得点数(排序+动态规划)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。