class Solution:
    def minSpaceWastedKResizing(self, nums: List[int], k: int) -> int:
        """tc O(N*N*K)
        """
        @lru_cache(None)
        def dfs(k, cur):
            if cur == len(A):
                return 0
            if k < 0 :
                return float('inf')
            maxv = 0
            sum_by_i = 0
            res = float('inf')
            for j in range(cur,len(A)):
                maxv = max(maxv, A[j])
                sum_by_i += A[j]
                diff = maxv * (j-cur+1) - sum_by_i
                res = min(res, diff + dfs(k-1,j+1))
            return res 
        return dfs(k,0)

Prefix sum Optimization

class Solution:
    def minSpaceWastedKResizing(self, A: List[int], k: int) -> int:
        """tc O(N*N*K)
        """
        psum = [0] 
        for i in range(len(A)):
            psum.append(psum[-1] + A[i])
        
        @lru_cache(None)
        def dfs(k,start,end):
            if k == 0:
                return max(A[start:end+1]) * (end-start+1) - (psum[end+1]-psum[start])

            res = float('inf')
            for cut_end in range(start,end+1-k):
                res = min(res, dfs(0, start, cut_end) + dfs(k-1, cut_end+1, end))
            return res
        
        return dfs(k,0,len(A)-1)