There are N piles of stones arranged in a row.  The i-th pile has stones[i] stones.
A move consists of merging exactly K consecutive piles into one pile, and the cost of this move is equal to the total number of stones in these K piles.
Find the minimum cost to merge all piles of stones into one pile.  If it is impossible, return -1.
 

Example 1:
Input: stones = [3,2,4,1], K = 2
Output: 20
Explanation: 
We start with [3, 2, 4, 1].
We merge [3, 2] for a cost of 5, and we are left with [5, 4, 1].
We merge [4, 1] for a cost of 5, and we are left with [5, 5].
We merge [5, 5] for a cost of 10, and we are left with [10].
The total cost was 20, and this is the minimum possible.


Example 2:
Input: stones = [3,2,4,1], K = 3
Output: -1
Explanation: After any merge operation, there are 2 piles left, and we can't merge anymore.  So the task is impossible.


Example 3:
Input: stones = [3,5,1,2,6], K = 3
Output: 25
Explanation: 
We start with [3, 5, 1, 2, 6].
We merge [5, 1, 2] for a cost of 8, and we are left with [3, 8, 6].
We merge [3, 8, 6] for a cost of 17, and we are left with [17].
The total cost was 25, and this is the minimum possible.

 
Note:

1 <= stones.length <= 30
2 <= K <= 30
1 <= stones[i] <= 100

```python

USER_FILENAME = "<user_code>"
import sys, json, builtins
import math, heapq, bisect, itertools, functools, collections, statistics, fractions, decimal, operator, array, random, re, string, os, pathlib
try:
    import resource as _res
except Exception:
    _res = None
from collections import Counter, defaultdict, deque, OrderedDict
from functools import lru_cache, reduce
from itertools import accumulate, permutations, combinations, product
from math import gcd, ceil, floor, sqrt
from decimal import Decimal
try:
    from typing import *
except Exception:
    pass
try:
    sys.setrecursionlimit(1_000_000)
except Exception:
    pass
try:
    import site as _site
    try:
        _sys_sites = _site.getsitepackages() if hasattr(_site, "getsitepackages") else []
        for _p in _sys_sites:
            if _p and _p not in sys.path:
                sys.path.append(_p)
    except Exception:
        pass
    try:
        _usp = _site.getusersitepackages()
        if isinstance(_usp, str):
            _usp = [_usp]
        for _p in _usp:
            if _p and _p not in sys.path:
                sys.path.append(_p)
    except Exception:
        pass
except Exception:
    pass

def _disabled_input(*args, **kwargs):
    raise RuntimeError("input() is disabled in callable mode")
builtins.input = _disabled_input

ns = {"__name__": "__judge__"}  # prevent if __name__ == "__main__" blocks
for _k, _v in list(globals().items()):
    if not _k.startswith("_"):
        ns[_k] = _v
_CODE = "class Solution:\n    def mergeStones(self, stones: List[int], K: int) -> int:\n        n = len(stones)\n        k = K\n        if (n < k and n != 1) or (n - 1) % (k - 1) != 0:\n            return -1\n        if n == 1:\n            return 0\n        \n        dp = [[-1 for _ in range(n)] for _ in range(n)]  # dp[i][j] stores min cost to reduce [i, j] as much as possible\n        self.solve(stones, 0, n - 1, k, dp)\n        # print(dp)\n        return dp[0][n - 1]\n    \n    def solve(self, stones, l, r, k, dp):\n        length = r - l + 1\n        if length < k:\n            dp[l][r] = 0\n            return\n        if length == k:\n            dp[l][r] = sum(stones[l:r+1])\n            return\n        res = float('inf')\n        for m in range(l, r):\n            length = length\n            length_l = m - l + 1\n            length_r = r - m\n            \n            rem = k - 1 if length % (k - 1) == 0 else length % (k - 1)\n            rem_l = k - 1 if length_l % (k - 1) == 0 else length_l % (k - 1)\n            rem_r = k - 1 if length_r % (k - 1) == 0 else length_r % (k - 1)\n            rem_total = k - 1 if (rem_l + rem_r) % (k - 1) == 0 else (rem_l + rem_r) % (k - 1)\n            if rem_total == rem and (rem_l + rem_r) <= k:\n                if dp[l][m] == -1:\n                    self.solve(stones, l, m, k, dp)\n                if dp[m + 1][r] == -1:\n                    self.solve(stones, m + 1, r, k, dp)\n                # print('lets check {} to {} and {}'.format(l, m, r))\n                # print(dp[l][m], dp[m+1][r])\n                res = min(res, dp[l][m] + dp[m+1][r])\n                \n        dp[l][r] = res\n        if rem == 1:\n            dp[l][r] += sum(stones[l:r+1])\n        \n    \n# class Solution:\n#     def mergeStones(self, stones: List[int], K: int) -> int:\n#         n = len(stones)\n#         k = K\n#         if (n < k and n != 1) or (n - k) % (k - 1) != 0:\n#             return -1\n#         if n == 1:\n#             return 0\n        \n#         return self.comp_min(stones, k, -1)\n    \n#     def comp_min(self, stones, k, locked):  # can't do a merge which only involves the first 'locked' stones\n#         n = len(stones)\n#         if n == k:\n#             return sum(stones)\n        \n#         total_cur_cost = float('inf')\n        \n#         for i in range(max(0, locked - k + 2), n - k + 1):\n#             cur_cost = sum(stones[i:i+k])\n#             new_stones = stones[:i] + [cur_cost] + stones[i+k:]\n            \n#             new_locked = i - 1\n            \n#             tmp = self.comp_min(new_stones, k, new_locked)\n            \n#             total_cur_cost = min(total_cur_cost, cur_cost + tmp)\n                \n#         return total_cur_cost\n"
_co = compile(_CODE, USER_FILENAME, "exec")
exec(_co, ns, ns)

_target = None
_fn_name = 'mergeStones'
if _fn_name:
    if "Solution" in ns:
        try:
            _obj = ns["Solution"]()
            if hasattr(_obj, _fn_name):
                _target = getattr(_obj, _fn_name)
        except Exception:
            _target = None
    if _target is None and _fn_name in ns and callable(ns[_fn_name]):
        _target = ns[_fn_name]
# Fallback: if there's exactly one user-defined function, use it
if _target is None:
    _cands = [v for k, v in ns.items() if callable(v) and getattr(v, "__module__", "") in ("__judge__", "__main__")]
    _user_funcs = [c for c in _cands if getattr(c, "__name__", "").startswith("_") is False]
    if len(_user_funcs) == 1:
        _target = _user_funcs[0]
if _target is None:
    raise RuntimeError(f"Could not resolve callable '{_fn_name}'")

_raw = sys.stdin.read().strip()
if _raw:
    _parsed = json.loads(_raw)
    if isinstance(_parsed, dict):
        _kwargs = _parsed.get("kwargs", {})
        _args = _parsed.get("args", [])
    else:
        _args, _kwargs = _parsed, {}
else:
    _args, _kwargs = [], {}
if not isinstance(_args, (list, tuple)):
    _args = [_args]
_res = _target(*_args, **_kwargs)
try:
    sys.stdout.write(repr(_res) + "\n")
except Exception:
    pass

```

Measured memory_bytes: 7688