Skip to content

Commit c2d85d3

Browse files
committed
Leetcode | Minimum Cost to Merge Stones | Kotlin
1 parent ff3602d commit c2d85d3

2 files changed

Lines changed: 34 additions & 0 deletions

File tree

leetcode/src/main/kotlin/com/devstromo/hard/p1000/SolutionKt.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,31 @@ class SolutionKt {
3636

3737
return dp[0][n - 1][1]
3838
}
39+
40+
fun mergeStonesBest(stones: IntArray, k: Int): Int {
41+
val n = stones.size
42+
if ((n - 1) % (k - 1) != 0) {
43+
return -1
44+
}
45+
46+
val prefixSum = IntArray(n + 1)
47+
for (i in 0 until n) {
48+
prefixSum[i + 1] = prefixSum[i] + stones[i]
49+
}
50+
51+
val dp = Array(n) { IntArray(n) }
52+
for (length in k..n) {
53+
for (i in 0..n - length) {
54+
val j = i + length - 1
55+
dp[i][j] = Int.MAX_VALUE
56+
for (m in i until j step k - 1) {
57+
dp[i][j] = minOf(dp[i][j], dp[i][m] + dp[m + 1][j])
58+
}
59+
if ((j - i) % (k - 1) == 0) {
60+
dp[i][j] += prefixSum[j + 1] - prefixSum[i]
61+
}
62+
}
63+
}
64+
return dp[0][n - 1]
65+
}
3966
}

leetcode/src/test/kotlin/com/devstromo/hard/p1000/SolutionKtUnitTest.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,11 @@ class SolutionKtUnitTest {
1212
assertEquals(-1, solution.mergeStones(intArrayOf(3, 2, 4, 1), 3))
1313
assertEquals(25, solution.mergeStones(intArrayOf(3, 5, 1, 2, 6), 3))
1414
}
15+
16+
@Test
17+
fun `Test Minimum Cost to Merge Stones Best`() {
18+
assertEquals(20, solution.mergeStonesBest(intArrayOf(3, 2, 4, 1), 2))
19+
assertEquals(-1, solution.mergeStonesBest(intArrayOf(3, 2, 4, 1), 3))
20+
assertEquals(25, solution.mergeStonesBest(intArrayOf(3, 5, 1, 2, 6), 3))
21+
}
1522
}

0 commit comments

Comments
 (0)