non colgo una valida struttura ricorsiva per poterlo fare.Prova a risolvere prima il problema della dieta di poldo (usando la guida), dopo aver sottoposto correttamente una soluzione per poldo prova a risolvere anche torri.Luke
Ottimo grazie a tutti, vi offrirei volentieri una birra!
Ottimo grazie a tutti, vi offrirei volentieri una birra!perché non ti ho aiutato? D:Luke
Ma ora pare che ci siano modi migliori no? un bel bis per aiutini pure su come migliorare le cose. Mi interessa soprattutto quello con cui si guarda solo la prima torre!
Ma ora pare che ci siano modi migliori no? un bel bis per aiutini pure su come migliorare le cose. Mi interessa soprattutto quello con cui si guarda solo la prima torre!Sicuro che si possa fare?Luke
Ma ora pare che ci siano modi migliori no? un bel bis per aiutini pure su come migliorare le cose. Mi interessa soprattutto quello con cui si guarda solo la prima torre!Non credo si possa fare...Luke
Si può abbassare la complessità a O(N log N) con l’utilizzo dei fenwick tree. Di meglio non credo si possa fare
Scusatemi potete spiegare a una povera anima innocente come posso usare il fenwick tree per arrivare a O(N log N)? Ci ho pensato un po’ ma non mi viene proprio in mente…
come hai fatto 0 secondi con n^2 ?
come hai fatto 0 secondi con n^2 ?Luke
I limiti del task sono bassi, quindi non c’è molta differenza nella pratica tra la soluzione n^2 e n \log n.
Anzi, non mi sorprenderei se la quadratica fosse addirittura più veloce, prendi ad esempio il problema del prodotto tra matrici: la soluzione banale è O(n^3), mentre la soluzione O(n^k) più veloce conosciuta è O(n^{2.3728639}). Nonostante la cubica sia asintoticamente più lenta ha una “costante nascosta” molto bassa, contrariamente alla soluzione asintoticamente migliore che ha una costante nascosta talmente alta che, per apprezzare la sua velocità, dovresti prendere matrici troppo grandi per essere gestite con un computer
Scusatemi potete spiegare a una povera anima innocente come posso usare il fenwick tree per arrivare a O(N log N)? Ci ho pensato un po' ma non mi viene proprio in mente...cyanpencil
L'idea è sostanzialmente la stessa: alla i-esima iterazione puoi ricavare la soluzione ottima per la sottosequenza formata dalle prime i torri a partire dalle soluzioni precedenti (questa è almeno l'implementazione bottom-up, con la top-down non cambia molto).
Ora, il passaggio critico è proprio nella ricerca del massimo. Se questa operazione richiede un tempo lineare, l'algoritmo finale avrà complessità quadratica. Con il Fenwick Tree può invece essere svolta in tempo logaritmico, tuttavia l'implemantazione non è proprio intuitiva.
Prova a risolvere il problema seguente con complessità NlogN, usando Fenwick: dato un array di N interi, determinare la lunghezza della massima sottosequenza crescente (Longest increasing subsequence) in esso contenuta. La soluzione per Torri è praticamente identica... ;)
Usando l’agoritmo greedy più binary search al posto del Fenwick, la LIS può essere trovata sempre in nlogn ma più velocemente nel concreto(cotte con il fenwick non mi faceva 100 qui sul cms).
Usando l'agoritmo greedy più binary search al posto del Fenwick, la LIS può essere trovata sempre in nlogn ma più velocemente nel concreto(cotte con il fenwick non mi faceva 100 qui sul cms).Non sempre la LIS è la soluzione migliore ;)EmanueleRossi
Si può abbassare la complessità a O(N log N) con l'utilizzo dei fenwick tree. Di meglio non credo si possa fareUna soluzione lineare non esiste, la soluzione migliore è usando un RangeTree ( soluzione piuttosto carina a mio parere!! ).mark03
Sicuro che si possa fare con i fenwick tree?
É possibile mettere un torri2, stesso problema ma con n dell'ordine dei 100k?come hai fatto 0 secondi con n^2 ?I limiti del task sono bassi, quindi non c'è molta differenza nella pratica tra la soluzione n2 e nlogn. Anzi, non mi sorprenderei se la quadratica fosse addirittura più veloce, prendi ad esempio il problema del prodotto tra matrici: la soluzione banale è O(n3), mentre la soluzione O(nk) più veloce conosciuta è O(n2.3728639). Nonostante la cubica sia asintoticamente più lenta ha una "costante nascosta" molto bassa, contrariamente alla soluzione asintoticamente migliore che ha una costante nascosta talmente alta che, per apprezzare la sua velocità, dovresti prendere matrici troppo grandi per essere gestite con un computer :PLuke
wil93
Giusto cosi testiamo le varie soluzione O(n log n) ;)
Usando l'agoritmo greedy più binary search al posto del Fenwick, la LIS può essere trovata sempre in nlogn ma più velocemente nel concreto(cotte con il fenwick non mi faceva 100 qui sul cms).Non sempre la LIS è la soluzione migliore ;)EmanueleRossi
mark03
Sì, in effetti è una LDS (il cui costo va poi sottratto a quello totale)...
Mi sa che ema non si riferiva specificamente al problema "torri" ma alla LIS in generaleUsando l'agoritmo greedy più binary search al posto del Fenwick, la LIS può essere trovata sempre in nlogn ma più velocemente nel concreto(cotte con il fenwick non mi faceva 100 qui sul cms).Non sempre la LIS è la soluzione migliore ;)EmanueleRossi
mark03
Mi sa che ema non si riferiva specificamente al problema "torri" ma alla LIS in generaleEsiste una implementazione supercorta della LIS:Degiac
set<int> S ; S.clear();
set<int>::iterator it ;
for( int i = 0 ; i < N ; i++ )
{
it = S.lower_bound( V[i] );
if( it != S.end() ) S.erase( it );
S.insert( V[i] );
}
Io l’ho implementata praticamente uguale, ma con i vector (così quando devo sostituire lo fa in O(1) e non in O(logN))
Come fai con i vector ad inserire un elemento nel giusto ordine?
( ovvero quale è l’equivalente dell’ S.insert( V[i] ) ? )