diff --git a/[M]dynamic-programming/[M]dynamic-programming/410-split-array-largest-sum.py b/[M]dynamic-programming/[M]dynamic-programming/410-split-array-largest-sum.py index daea220..0fa1570 100644 --- a/[M]dynamic-programming/[M]dynamic-programming/410-split-array-largest-sum.py +++ b/[M]dynamic-programming/[M]dynamic-programming/410-split-array-largest-sum.py @@ -6,42 +6,39 @@ def splitArray(self, nums: List[int], k: int) -> int: for i, num in enumerate(nums): total += num prefix[i + 1] = total - dp = [[float('inf')] * (k + 1) for _ in range(n)] - for i in range(n): - dp[i][1] = prefix[i + 1] - prefix[0] + dp = [[float('inf') for _ in range(k + 1)] for _ in range(n)] + for end in range(n): + dp[end][1] = prefix[end + 1] - prefix[0] + for end in range(n): for interval in range(2, k + 1): for cut in range(end, interval - 2, - 1): - cur_res = max(dp[cut - 1][interval - 1], prefix[end + 1] - prefix[cut]) - dp[end][interval] = min(dp[end][interval], cur_res) - + largest_sum = max(dp[cut - 1][interval - 1], prefix[end + 1] - prefix[cut]) + dp[end][interval] = min(dp[end][interval], largest_sum) return dp[n - 1][k] -# time O(n** 2 * k) +# time O(n**2 * k) # space O(nk) # using dynamic programming and interval (start from one interval) class Solution: def splitArray(self, nums: List[int], k: int) -> int: - def valid(limit): + def valid(bound): + group = 1 total = 0 - group = 0 for num in nums: - if num > limit: + if num > bound: return False - if total + num <= limit: - total += num - else: + if total + num > bound: group += 1 total = num - if total: - group += 1 + else: + total += num return group <= k - total = sum(nums) - left, right, boundary = 0, total, - 1 + left, right, boundary = 0, sum(nums), - 1 while left <= right: m = (left + right) // 2 if valid(m):