1. 程式人生 > >【Leetcode_總結】 740. 刪除與獲得點數 - python

【Leetcode_總結】 740. 刪除與獲得點數 - python

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)