4
public int mergeStones(int[] stones, int k) {6
if ((n - 1) % (k - 1) != 0) return -1;7
prefix = new int[stones.length + 1];10
for (int i = 0; i < stones.length; i++) {14
int dp[][] = new int[stones.length][stones.length];15
for (int i = 0; i < dp.length; i++) {16
for (int j = 0; j < dp[0].length; j++) {20
return check(prefix, k, 0, stones.length - 1, dp);23
public int check(int[] prefix, int k, int i, int j, int dp[][]) {30
int min = Integer.MAX_VALUE;31
for (int t = i; t < j; t = t + k - 1) {32
int min1 = check(prefix, k, i, t, dp) + check(prefix, k, t + 1, j, dp);33
min = Math.min(min, min1);35
if ((j - i) % (k - 1) == 0) {36
min += prefix[j + 1] - prefix[i];44
public int mergeStones(int[] stones, int K) {45
int n = stones.length;46
if ((n - 1) % (K - 1) > 0) return -1;48
int[] prefix = new int[n + 1];49
for (int i = 0; i < n; i++) prefix[i + 1] = prefix[i] + stones[i];51
int[][] dp = new int[n][n];52
for (int m = K; m <= n; ++m)53
for (int i = 0; i + m <= n; ++i) {55
dp[i][j] = Integer.MAX_VALUE;56
for (int mid = i; mid < j; mid += K - 1)57
dp[i][j] = Math.min(dp[i][j], dp[i][mid] + dp[mid + 1][j]);58
if ((j - i) % (K - 1) == 0) dp[i][j] += prefix[j + 1] - prefix[i];