Hard
Minimum Cost to Merge Stones — C++
Full explanation · Time O(n^3 / k) · Space O(n^2)
// Time: O(n^3 / k)
// Space: O(n^2)
class Solution {
public:
int mergeStones(vector<int>& stones, int K) {
if ((stones.size() - 1) % (K - 1)) {
return -1;
}
vector<int> prefix(stones.size() + 1, 0);
partial_sum(cbegin(stones), cend(stones), next(begin(prefix)), plus<int>());
vector<vector<int> > dp(stones.size(), vector<int>(stones.size()));
for (int l = K - 1; l < stones.size(); ++l) {
for (int i = 0; i + l < stones.size(); ++i) {
dp[i][i + l] = numeric_limits<int>::max();
for (int j = i; j + 1 <= i + l; j += K - 1) {
dp[i][i + l] = min(dp[i][i + l], dp[i][j] + dp[j + 1][i + l]);
}
if (l % (K - 1) == 0) {
dp[i][i + l] += prefix[i + l + 1] - prefix[i];
}
}
}
return dp[0][stones.size() - 1];
}
};