Skip to content

Commit d456ffc

Browse files
authoredMar 3, 2019
Create minimum-cost-to-merge-stones.py
1 parent d222411 commit d456ffc

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed
 
+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Time: O(n^3)
2+
# Space: O(n^3)
3+
4+
# memoization (top-down dp)
5+
class Solution(object):
6+
def mergeStones(self, stones, K):
7+
"""
8+
:type stones: List[int]
9+
:type K: int
10+
:rtype: int
11+
"""
12+
def dp(prefix, K, i, j, k, lookup):
13+
if (i, j, k) in lookup:
14+
return lookup[i, j, k]
15+
if i == j:
16+
result = 0 if k == 1 else float("inf")
17+
else:
18+
if k == 1:
19+
result = dp(prefix, K, i, j, K, lookup) + \
20+
prefix[j+1] - prefix[i]
21+
else:
22+
result = float("inf")
23+
for mid in xrange(i, j, K-1):
24+
result = min(result, dp(prefix, K, i, mid, 1, lookup) +
25+
dp(prefix, K, mid+1, j, k-1, lookup))
26+
lookup[i, j, k] = result
27+
return result
28+
29+
if (len(stones)-1) % (K-1):
30+
return -1
31+
lookup = {}
32+
prefix = [0]
33+
for x in stones:
34+
prefix.append(prefix[-1]+x)
35+
result = dp(prefix, K, 0, len(stones)-1, 1, lookup)
36+
return result if result != float("inf") else 0

0 commit comments

Comments
 (0)
Please sign in to comment.