Hard
Allocate Mailboxes — Python
Full explanation · Time O(m * n^2) · Space O(n)
# Time: O(m * n^2)
# Space: O(n)
class Solution(object):
def minDistance(self, houses, k):
"""
:type houses: List[int]
:type k: int
:rtype: int
"""
def cost(prefix, i, j):
return (prefix[j+1]-prefix[(i+j+1)//2])-(prefix[(i+j)//2+1]-prefix[i])
houses.sort()
prefix = [0]*(len(houses)+1)
for i, h in enumerate(houses):
prefix[i+1] = prefix[i]+h
dp = [cost(prefix, 0, j) for j in xrange(len(houses))]
for m in xrange(1, k):
for j in reversed(xrange(m, len(houses))):
for i in xrange(m, j+1):
dp[j] = min(dp[j], dp[i-1]+cost(prefix, i, j))
return dp[-1]