C'è un noto problema di programmazione dinamica che si chiama "miniera d'oro". Hai una griglia n x n, ciascuna delle quali contiene un certo valore di monete. Inizi a partire dal basso a sinistra e puoi solo muoverti a destra, in alto o diagonalmente in alto e a destra. L'obiettivo del tuo algoritmo è determinare il percorso attraverso la miniera che massimizza la quantità di oro che raccogli.
Una soluzione di esempio: link
È possibile risolvere questo problema usando un approccio divide-and-conquer usando O (n) space o meno, usando ancora O (n ^ 2) tempo?
Il mio primo sospetto è che puoi dividere la griglia in quadranti in modo ricorsivo, trovare il percorso migliore in ciascuno di quei quadranti, quindi in qualche modo unire il risultato alla fine per ottenere il percorso migliore attraverso l'intera faccenda. Usando solo lo spazio O (n) è possibile memorizzare i percorsi in ogni quadrante, poiché il percorso più lungo attraverso ciascuno di essi è 2n - 2. Ma facendo ciò "dimentichi" altre celle che valgono punti che non sono stati scelti, e la risposta fornita da quell'algoritmo ha la tendenza ad essere errata. Se guardiamo tutte le celle in ogni fase di unione nel tentativo di ricordare quelle scartate (che impiega n ^ 2 volte), allora la soluzione alla relazione di ricorrenza per il tempo di esecuzione diventa n ^ 2 log n invece di n ^ 2, tramite il teorema principale. La fase di unione deve essere eseguita in O (n log n) o O (n).
Lo spazio richiesto qui è il kicker più del tempo richiesto.