ho visto varie discussioni e tentativi di codice a risolvere il problema "String reduction" da interviewstreet.com, ma nessuno di loro lo fa tramite la programmazione dinamica.Solving "riduzione stringa" sfida
Pubblicata nella sezione Dynamic Programming, il problema è descritto come segue:
Data una stringa costituita da una, bec di, possiamo eseguire la seguente operazione: prendere qualsiasi due caratteri distinte adiacenti e sostituirla con il terzo personaggio. Ad esempio, se 'a' e 'c' sono adiacenti, possono essere sostituiti con 'b'.
Qual è la stringa più piccola che può risultare applicando questa operazione ripetutamente?
Il problema può essere risolto utilizzando esaustivo di ricerca a forza bruta, creando di fatto un albero di tutte le possibili sostituzioni:
// this is more or less pseudo code from my head
int GetMinLength(string s)
{
// solve edge cases
if (s.Length == 1) return 1;
if (s.Length == 2) return ReduceIfPossible(s);
// recursive brute force
int min = s.Length;
for (int i = 0; i<s.Length-1; i++)
{
if (s[i] != s[i+1])
{
var next = GetMinLength(
s.Substring(0, i) +
Reduce(s[i], s[i + 1]) +
s.Substring(i + 2)
);
if (next < min) min = next;
}
}
}
questo non riesce, ovviamente, per i più grandi N
(N <= 100
), quindi sto cercando di rompere in sottoproblemi più piccoli, memorizzali e unisci i risultati.
Il problema è che non riesco a determinare lo stato che avrebbe "optimal substructure", necessario per applicare la programmazione dinamica (o in altre parole per "unire" i risultati dei sotto-problemi). Ridurre al minimo una parte della stringa non garantisce che la stringa finale sarà davvero la soluzione più piccola.
Quale sarebbe il sottoproblema "stato" in questo caso, che potrebbe essere fusa verso la soluzione finale?
@Dilbert Esattamente. Ma fai una ricerca annidata: puoi cercare una cosa e poi l'altra. (Questa tabella è più facile da generare iniziando alla fine della stringa e poi procedendo a ritroso.) – btilly
Potresti chiarire il primo passo un po 'di più? Penso che tu voglia che io costruisca una tabella di tutti i blocchi di lunghezza inferiore o uguale alla stringa del problema che può ridurre a uno dei tre caratteri. Ma cosa intendi con "per carattere finisci con, posizione iniziale"? Sono un noob in DP. – gautam1168
@ gautam1168 Intendevo esattamente quello che ho detto. :-) Dato un carattere finale e una posizione di partenza, è necessario un elenco di tutti i punti finali di intervalli in cui è possibile comprimere da quella posizione iniziale a quell'endpoint e terminare con quel personaggio. Ciò richiede la risoluzione di un problema DP per ogni punto di partenza che può essere risolto se hai già risolto lo stesso problema per tutti quelli successivi. (Nota, dovrai fare un sacco di fusioni di intervalli. Cerca "code di priorità" per qualcosa che possa aiutarti.) – btilly