LeetCode: Reducing Dishes Posted on February 10, 2020July 26, 2020 by braindenny Reducing Dishes Similar Problems: CheatSheet: LeetCode For Code Interview CheatSheet: Common Code Problems & Follow-ups Tag: #knapsack A chef has collected data on the satisfaction level of his n dishes. Chef can cook any dish in 1 unit of time. Like-time coefficient of a dish is defined as the time taken to cook that dish including previous dishes multiplied by its satisfaction level i.e. time[i]*satisfaction[i] Return the maximum sum of Like-time coefficient that the chef can obtain after dishes preparation. Dishes can be prepared in any order and the chef can discard some dishes to get this maximum value. Example 1: Input: satisfaction = [-1,-8,0,5,-9] Output: 14 Explanation: After Removing the second and last dish, the maximum total Like-time coefficient will be equal to (-1*1 + 0*2 + 5*3 = 14). Each dish is prepared in one unit of time. Example 2: Input: satisfaction = [4,3,2] Output: 20 Explanation: Dishes can be prepared in any order, (2*1 + 3*2 + 4*3 = 20) Example 3: Input: satisfaction = [-1,-4,-5] Output: 0 Explanation: People don't like the dishes. No dish is prepared. Example 4: Input: satisfaction = [-2,5,-1,0,3,-3] Output: 35 Constraints: n == satisfaction.length 1 <= n <= 500 -10^3 <= satisfaction[i] <= 10^3 Github: code.dennyzhang.com Credits To: leetcode.com Leave me comments, if you have better ways to solve. Solution: ## https://code.dennyzhang.com/reducing-dishes ## Basic Ideas: knapsack problem ## ## For each dish, whether to prepare it or discard it ## ## dp(i, time): dish i ## take it: ## discard it: ## ## Complexity: Time O(n*n), Space O(n*n) class Solution: def maxSatisfaction(self, satisfaction: List[int]) -> int: satisfaction.sort() n = len(satisfaction) dp = [[-sys.maxsize for _ in range(n+1)] for _ in range(n+1)] dp[0][0] = 0 for i in range(n): v = satisfaction[i] # don't take for j in range(n+1): dp[i+1][j] = dp[i][j] # take it for j in range(1, n+1): # when it's valid if dp[i][j-1] != -sys.maxsize: dp[i+1][j] = max(dp[i+1][j], dp[i][j-1]+v*j) return max(dp[n]) Post Views: 0