不断二分尝试分段的最大值为mx时能不能划分为k段
class Solution:
def splitArray(self, nums: List[int], k: int) -> int:
def check(mx: int) -> bool:
cnt = 1
s = 0
for x in nums:
if s + x <= mx:
s += x
else:
if cnt==k or x>mx:
return False
cnt += 1
s = x
return cnt<=k
right = sum(nums)
left = max(max(nums) - 1, (right-1) // k)
while left < right:
mid = (left + right) // 2
if check(mid):
right = mid
else:
left = mid+1
return left
划分dp的做法( dp[i][j]即nums[:i+1]划分为j段的最小最大值)
class Solution:
def splitArray(self, nums: List[int], k: int) -> int:
pre = [0] * (len(nums)+1) # 前缀和
dp = [[float('inf')] * k for _ in range(len(nums))]
for i in range(len(nums)):
pre[i+1] = pre[i] + nums[i]
dp[i][0] = pre[i+1]
for i in range(len(nums)):
for j in range(1,k):
for t in range(j-1,i):
dp[i][j] = min(dp[i][j],max(dp[t][j-1], pre[i+1]-pre[t+1]))
return int(dp[-1][-1])