Come David ha mostrato sopra (con una prova eccellente!), Questo è NP-difficile in modo da non ottenere una risposta perfetta in ogni situazione.
Un approccio da aggiungere alle altre risposte è esprimere questo come un problema di flusso massimo.
Definire un nodo di origine S, un nodo di sink D, un nodo per ogni parola e un nodo per ogni lettera.
Aggiungi bordi da S ad ogni parola della capacità 1.
Aggiungi bordi da ogni parola alle lettere in esso contenute di capacità infinita.
Aggiungere bordi da ogni lettera a D di capacità x (dove definiremo x in un momento).
Quindi risolvere per il taglio minimo di questo grafico (utilizzando un algoritmo di flusso massimo da S a D). Un taglio a una lettera indica che quella lettera non viene inclusa nella soluzione.
Questo può essere pensato come risolvere il problema in cui otteniamo una ricompensa di 1 per ogni parola, ma ci costa x per ogni nuova lettera che usiamo.
Quindi l'idea è di variare x (ad esempio per bisezione) per cercare e trovare un valore per x dove vengono tagliati esattamente i bordi di lettera k. Se gestisci questo, avrai identificato la soluzione esatta al tuo problema.
Questo approccio è ragionevolmente efficiente, ma dipende dai dati di input indipendentemente dal fatto che troverà o meno la risposta. Per alcuni esempi (ad esempio la costruzione di David per trovare clique) scoprirai che variando x improvvisamente salterai dall'includere meno di k lettere ad includere più di k lettere. Tuttavia, anche in questo caso potreste scoprire che aiuta a fornire limiti inferiori e superiori per il numero massimo di parole nella soluzione esatta.
fonte
2014-10-11 16:08:41
Quanto può essere grande P? E quante lettere distinte ci sono (in tutte le parole in totale)? – kraskevich
Sto cercando di capire esattamente come, ma non è banale. Raccomando comunque di considerare la soluzione pseudo-polinomica di programmazione dinamica per il problema dello zaino, ho intenzione di provare in quella vena. –
In che modo la vecchia versione della domanda ha ricevuto 9 downvotes, e questo sfacciato secondo tentativo ha ricevuto 10 upvotes? – Marco13