classSolution{public:intmergeStones(vector<int>&stones,intK){constintn=stones.size();this->K=K;// dp[i][j][k] := min cost to merge stones[i..j] into k pilesdp.resize(n,vector<vector<int>>(n,vector<int>(K+1,kMax)));prefix.resize(n+1);partial_sum(begin(stones),end(stones),begin(prefix)+1);constintcost=mergeStones(stones,0,n-1,1);returncost==kMax?-1:cost;}private:constexprstaticintkMax=1'000'000'000;intK;vector<vector<vector<int>>>dp;vector<int>prefix;intmergeStones(constvector<int>&stones,inti,intj,intk){if((j-i+1-k)%(K-1))returnkMax;if(i==j)returnk==1?0:kMax;if(dp[i][j][k]!=kMax)returndp[i][j][k];if(k==1)returnmergeStones(stones,i,j,K)+prefix[j+1]-prefix[i];for(intm=i;m<j;m+=K-1)dp[i][j][k]=min(dp[i][j][k],mergeStones(stones,i,m,1)+mergeStones(stones,m+1,j,k-1));returndp[i][j][k];}};
classSolution{publicintmergeStones(int[]stones,intK){finalintn=stones.length;this.K=K;// dp[i][j][k] := min cost to merge stones[i..j] into k pilesdp=newint[n][n][K+1];for(int[][]A:dp)Arrays.stream(A).forEach(a->Arrays.fill(a,kMax));prefix=newint[n+1];for(inti=0;i<n;++i)prefix[i+1]=prefix[i]+stones[i];finalintcost=mergeStones(stones,0,n-1,1);returncost==kMax?-1:cost;}privatestaticfinalintkMax=1_000_000_000;privateintK;privateint[][][]dp;privateint[]prefix;privateintmergeStones(finalint[]stones,inti,intj,intk){if((j-i+1-k)%(K-1)!=0)returnkMax;if(i==j)returnk==1?0:kMax;if(dp[i][j][k]!=kMax)returndp[i][j][k];if(k==1)returnmergeStones(stones,i,j,K)+prefix[j+1]-prefix[i];for(intm=i;m<j;m+=K-1)dp[i][j][k]=Math.min(dp[i][j][k],mergeStones(stones,i,m,1)+mergeStones(stones,m+1,j,k-1));returndp[i][j][k];}}
classSolution{public:intmergeStones(vector<int>&stones,intK){constintn=stones.size();if((n-1)%(K-1))return-1;constexprintkMax=1'000'000'000;// dp[i][j][k] := min cost to merge stones[i..j] into k pilesvector<vector<vector<int>>>dp(n,vector<vector<int>>(n,vector<int>(K+1,kMax)));vector<int>prefix(n+1);for(inti=0;i<n;++i)dp[i][i][1]=0;partial_sum(begin(stones),end(stones),begin(prefix)+1);for(intd=1;d<n;++d)for(inti=0;i+d<n;++i){constintj=i+d;for(intk=2;k<=K;++k)// Pilesfor(intm=i;m<j;m+=K-1)dp[i][j][k]=min(dp[i][j][k],dp[i][m][1]+dp[m+1][j][k-1]);dp[i][j][1]=dp[i][j][K]+prefix[j+1]-prefix[i];}returndp[0][n-1][1];}};