Module: Pattern nella programmazione dinamica - 2


Problem

4 /5


Nano

Theory Click to read/hide

Dichiarazione di non responsabilità: il metodo descritto di seguito non è universale, ma spesso può risolvere un problema o aiutarti a trovare la soluzione giusta.

Se hai bisogno di verificare l'esistenza di una permutazione in un problema, o trovare il numero di permutazioni che corrispondono, o qualcosa di simile, allora dovresti prendere in considerazione l'utilizzo della programmazione di sottoinsiemi dinamici.

Il parametro principale sarà una maschera di bit, che mostrerà quali elementi sono già stati inclusi nella permutazione e quali no. Inoltre spesso è richiesto un secondo parametro che indichi quale elemento è stato incluso per ultimo.

Spesso le permutazioni possono essere viste nel contesto dei percorsi nei grafici. Di conseguenza, consideriamo un esempio classico: il problema del percorso hamiltoniano.
Un cammino hamiltoniano è un cammino semplice che attraversa ogni vertice del grafo esattamente una volta. Può essere rappresentato semplicemente come una permutazione di lunghezza n, dove n è il numero di vertici. L'ordine all'interno di questa permutazione indicherà l'ordine in cui vengono attraversati i vertici in questo percorso.

Per verificare la presenza di un percorso hamiltoniano nel grafico, iniziamo la dinamica dp[mask][last] - esiste un percorso semplice che ha aggirato i vertici contrassegnati con quelli nella maschera di bit ed è finito all'ultimo vertice.
I valori iniziali saranno dp[2i][i] = true, il resto false, il che significa che c'è sempre un percorso vuoto che inizia in uno qualsiasi dei vertici.
Avendo il valore true in dp[mask][last] faremo delle transizioni in avanti, nel senso di "estendere il percorso". Cioè, cercheremo i numeri di vertici che sono contrassegnati con zero nella maschera (non li abbiamo ancora visitati per strada) e allo stesso tempo tale che ci sia un bordo dall'ultimo a questo vertice (il percorso deve essere esteso da un bordo esistente). Cioè, facciamo dp[mask | 2k][k] = true se dp[mask][last] = true AND mask & 2k = 0 (il vertice k non è stato ancora visitato) E c'è un ultimo spigolo -> k.
In definitiva, esiste un percorso hamiltoniano se esiste un valore vero in dp per i parametri della maschera di bit tutti uno e per ogni ultimo vertice.

Problem

Una volta il nano Quark si è imbattuto in una mappa del tesoro. Ci sono N punti segnati sulla mappa dove si può trovare il tesoro. Tutti i punti sono numerati da 1 a N. Per ogni coppia di punti, Quark conosce la lunghezza della strada che li collega. Quark inizia la sua ricerca dal punto numero 1. Prima di iniziare il suo lungo viaggio, l'astuto nano cancella i punti in cui, a suo avviso, non possono esserci tesori. È garantito che il punto numero 1 non sia mai barrato. Successivamente, Quark sceglie un percorso che attraversa tutti i punti rimanenti sulla mappa. Il percorso non attraversa lo stesso punto più di una volta. Un quark può camminare solo su strade che collegano punti non incrociati.

Quark vuole scegliere un percorso di lunghezza minima. È necessario trovare un tale percorso per Quark.

Inserimento
La prima riga contiene un numero intero N (1 ≤ N ≤ 15) — il numero di punti segnati sulla mappa. Le successive N righe contengono le distanze tra i punti. La (i+1)-esima riga contiene N interi di1,di2, diN — lunghezze di strade dall'i-esimo punto a tutti gli altri. È garantito che dij=dji, dii=0 e 0 <dij < 100 . La (N+2)esima riga contiene un numero intero Q (1 < Q ≤ 1000) — il numero di opzioni per l'eliminazione di punti per questa mappa. Le seguenti righe Q contengono una descrizione delle opzioni per la cancellazione. La descrizione inizia con il numero C (0 ≤ C < N) — il numero di punti in cui, secondo Quark, il tesoro non può essere. I successivi numeri C danno i numeri di questi punti.

Impressum
Stampa linee Q. In ogni riga stampa un numero intero — la lunghezza del percorso minimo con la corrispondente opzione di cancellazione dei punti.
Esempi
# Input Uscita
1 3
0  45 10
45 0  30
10 30 0
2
0
1 3
40
45
2 5
0  14 20 17 14
14 0  15 19 18
20 15 0  15 16
17 19 15 0  14
14 18 16 14 0
2
3 5 4 3
0
14
58