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

export function stampCover(label: string, dies: [string, number][]): number {
    const fragmentPrices = stampTable(dies);

    if (!/^[a-zA-Z]+$/.test(label)) {
        throw new Error("Label must be a non-empty string.");
    }

    const dp = Array.from({ length: label.length + 1 }, () => Infinity);
    dp[0] = 0; // Base case: no cost to print an empty label

    for (let i = 1; i <= label.length; i++) {
        for (const [fragment, price] of fragmentPrices.entries()) {
            const lastFragmentIndex = label.lastIndexOf(fragment, i - 1);
            if (lastFragmentIndex === -1) continue;
            dp[i] = Math.min(dp[i], dp[lastFragmentIndex + 1] + price);
        }
    }

    return dp[label.length];
}
```