```ts
export function stampTable(dies: [string, number][]): Map<string, number> {
  const table = new Map<string, number>();
  for (const [fragment, price] of dies) {
    if (typeof fragment !== "string" || fragment.length === 0) {
      throw new Error("a die fragment must be a non-empty string");
    }
    if (!Number.isInteger(price) || price <= 0) {
      throw new Error("a die price must be a positive integer");
    }
    if (table.has(fragment)) {
      throw new Error("die listed twice: " + fragment);
    }
    table.set(fragment, price);
  }
  return table;
}

export function stampCover(label: string, dies: [string, number][]): number {
  if (typeof label !== "string" || label.length === 0) {
    throw new Error("a label must be a non-empty string");
  }

  const table = stampTable(dies);

  const memo: Record<string, number> = {};
  let minCost = Infinity;

  function dp(index: number): void {
    if (index >= label.length) {
      if (memo[label] === undefined || cost < memo[label]) {
        memo[label] = cost;
        return;
      }
      return;
    }

    for (const [fragment, price] of table.entries()) {
      const newCost = cost + price;
      const fragmentIndex = label.indexOf(fragment, index);
      if (fragmentIndex === -1) continue;

      dp(index + fragment.length);
      cost = newCost;
    }
  }

  let cost = 0;
  dp(0);

  return minCost === Infinity ? -1 : minCost;
}
```