classSolution{public:intsplitArray(vector<int>&nums,intm){constintn=nums.size();// dp[i][k] := min of largest sum to split first i nums into k groupsdp.resize(n+1,vector<int>(m+1,INT_MAX));prefix.resize(n+1);partial_sum(begin(nums),end(nums),begin(prefix)+1);returnsplitArray(nums,n,m);}private:vector<vector<int>>dp;vector<int>prefix;intsplitArray(constvector<int>&nums,inti,intk){if(k==1)returnprefix[i];if(dp[i][k]<INT_MAX)returndp[i][k];// Try all possible partitionsfor(intj=k-1;j<i;++j)dp[i][k]=min(dp[i][k],max(splitArray(nums,j,k-1),prefix[i]-prefix[j]));returndp[i][k];}};
classSolution{publicintsplitArray(int[]nums,intm){finalintn=nums.length;// dp[i][k] := min of largest sum to split first i nums into k groupsdp=newint[n+1][m+1];prefix=newint[n+1];Arrays.stream(dp).forEach(A->Arrays.fill(A,Integer.MAX_VALUE));for(inti=0;i<n;++i)prefix[i+1]=nums[i]+prefix[i];returnsplitArray(nums,n,m);}privateint[][]dp;privateint[]prefix;privateintsplitArray(int[]nums,inti,intk){if(k==1)returnprefix[i];if(dp[i][k]<Integer.MAX_VALUE)returndp[i][k];// Try all possible partitionsfor(intj=k-1;j<i;++j)dp[i][k]=Math.min(dp[i][k],Math.max(splitArray(nums,j,k-1),prefix[i]-prefix[j]));returndp[i][k];}}
classSolution:defsplitArray(self,nums:List[int],m:int)->int:n=len(nums)prefix=[0]+list(itertools.accumulate(nums))# Dp(i, k) := min of largest sum to split first i nums into k groups@functools.lru_cache(None)defdp(i:int,k:int)->int:ifk==1:returnprefix[i]ans=math.inf# Try all possible partitionsforjinrange(k-1,i):ans=min(ans,max(dp(j,k-1),prefix[i]-prefix[j]))returnansreturndp(n,m)