def min_cost(cost, pair_cost, k):
n = len(cost)
dp = {}
def solve(i, j, k_used):
if i > j:
return 0
if (i, j, k_used) in dp:
return dp[(i, j, k_used)]
ans = float('inf')
# Buy leftmost
ans = min(ans, cost[i] + solve(i + 1, j, k_used))
# Buy rightmost
ans = min(ans, cost[j] + solve(i, j - 1, k_used))
# Buy leftmost and rightmost
if k_used < k:
ans = min(ans, pair_cost + solve(i + 1, j - 1, k_used + 1))
dp[(i, j, k_used)] = ans
return ans
return solve(0, n - 1, 0)
ZGVmIG1pbl9jb3N0KGNvc3QsIHBhaXJfY29zdCwgayk6CiAgICBuID0gbGVuKGNvc3QpCiAgICBkcCA9IHt9CgogICAgZGVmIHNvbHZlKGksIGosIGtfdXNlZCk6CiAgICAgICAgaWYgaSA+IGo6CiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgaWYgKGksIGosIGtfdXNlZCkgaW4gZHA6CiAgICAgICAgICAgIHJldHVybiBkcFsoaSwgaiwga191c2VkKV0KCiAgICAgICAgYW5zID0gZmxvYXQoJ2luZicpCiAgICAgICAgIyBCdXkgbGVmdG1vc3QKICAgICAgICBhbnMgPSBtaW4oYW5zLCBjb3N0W2ldICsgc29sdmUoaSArIDEsIGosIGtfdXNlZCkpCiAgICAgICAgIyBCdXkgcmlnaHRtb3N0CiAgICAgICAgYW5zID0gbWluKGFucywgY29zdFtqXSArIHNvbHZlKGksIGogLSAxLCBrX3VzZWQpKQogICAgICAgICMgQnV5IGxlZnRtb3N0IGFuZCByaWdodG1vc3QKICAgICAgICBpZiBrX3VzZWQgPCBrOgogICAgICAgICAgICBhbnMgPSBtaW4oYW5zLCBwYWlyX2Nvc3QgKyBzb2x2ZShpICsgMSwgaiAtIDEsIGtfdXNlZCArIDEpKQoKICAgICAgICBkcFsoaSwgaiwga191c2VkKV0gPSBhbnMKICAgICAgICByZXR1cm4gYW5zCgogICAgcmV0dXJuIHNvbHZlKDAsIG4gLSAxLCAwKQ==