1. 程式人生 > >leetcode740_刪除與獲得點數

leetcode740_刪除與獲得點數

給定一個整數陣列 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]範圍內。

 

思路:

動態規劃的思想:dp[i] 表示輪到i時,現有的point 

選擇它就要拋棄i-1和i+1, dp[i] = 所有i的和 + dp[i-2]  

拋棄它意味著dp[i] = dp[i+1]

public static int deleteAndEarn(int[] nums) {
		 if (nums == null || nums.length == 0) {
	            return 0;
	        }
	        int[] dp = new int[10001];
	        for (int num : nums) {
	            dp[num]++;        //nums陣列中元素出現的個數
	        }
	        for (int i = 2 ; i < dp.length; i++) {
	        	//dp[i]求出的值也要被後面依賴
	            dp[i] = Math.max(i * dp[i] + dp[i - 2], dp[i - 1]);
	        }
	        return dp[dp.length - 1];
	    }