【Leetcode_總結】 740. 刪除與獲得點數 - python
阿新 • • 發佈:2018-12-31
Q:
給定一個整數陣列 nums
,你可以對它進行一些操作。
每次操作中,選擇任意一個 nums[i]
,刪除它並獲得 nums[i]
的點數。之後,你必須刪除每個等於 nums[i] - 1
或 nums[i] + 1
的元素。
開始你擁有 0 個點數。返回你能通過這些操作獲得的最大點數。
連結:https://leetcode-cn.com/problems/delete-and-earn/submissions/
思路:使用動態規劃的方法解決問題,狀態矩陣dp儲存第i個值刪除或者保留所獲得的最大收益,狀態轉移矩陣為
dp[i] = max(dp[i - 1], i * dic[i] + dp[i - 2]) 。
程式碼:
class Solution(object): def deleteAndEarn(self, nums): """ :type nums: List[int] :rtype: int """ if not nums: return 0 dic = {} for num in nums: if num in dic: dic[num] += 1 else: dic[num] = 1 dp = [0 for _ in range(max(nums)+1)] if 1 in dic: dp[1] = max(dp[0], dic[1]) else: dp[1] = 0 for i in range(2,len(dp)): if i in dic: dp[i] = max(dp[i - 1], i * dic[i] + dp[i - 2]) else: dp[i] = dp[i - 1] return max(dp)