Programmazione dinamica e esclusione delle soluzioni precedenti

Ciao.

Ho un dubbio su come risolvere questo esercizio: ktree (https://cms.di.unipi.it/#/task/kfree/statement) però il problema è valido anche per un altro esercizio che non ricordo.

Ho un caso esempio l’array di soluzioni è

[0] [1] [2] [3]
1 2 3 3 Array di soluzioni

  • 0 1 1 Array di soluzione precedente
    Che significa ad esempio la soluzione[3] è calcolata a partire dalla soluzione[1] che a sua volta dalla soluzione[0]
    cioè [0] <-- [1] <-- [3]
    Il problema si pone ad esempio che l’elemento 3 è “incompatibile” con l’elemento 0 ma ok con l’elemento 1
    cioè la relazione [1] <-- [3] è ok, ma [0] <-- [3] no.
    Il problema sorge quando devo verificare che posso calcolare sol[3] a partire da sol[1], non so come verificare che sol[1] deriva da sol[0] e quindi non posso calcolare sol[3] a partire da sol[1].
    Non so come implementare l’algoritmo. La idea principale di salvare la provenienza della soluzione e a ritroso controllare se è presente una soluzione proibita che tuttavia potrebbe dare origine a problemi

Sono stato chiaro o confusionario?

Riusciresti a spiegare meglio come intendi utilizzare la programmazione dinamica per risolvere questo problema?
Temo non sia l’approccio giusto in questo caso :confused:

Il ragionamento è cosi. Se gli elementi se
Ripeti i da 0 a N-1
Max = 0
Ripeti j da 0 a i-1
Se Ele[j]*K == Ele[i]
Salta giro
Altrimenti
Se Max < Sol[j] ==> Max = Sol[j]
Sol[i] = Max + 1

Non sono ancora sicurissimo di aver capito, magari prova a spiegarlo a parole :confused: comunque non mi pare che si tratti di programmazione dinamica…

Però posso darti questo consiglio, utilizza un array grande quanto il numero più grande che compare nella sequenza : ciascun elemento sarà true o false in base alla presenza del suo indice nella sequenza.
In questo modo con un semplice ciclo su questo array, puoi sapere per ciascun numero se deve o meno essere rimosso :slight_smile:

EDIT: Credo di non essere stato molto chiaro, inoltre non avendo ancora capito se la tua soluzione possa funzionare non vorrei proportene un’altra ignorando la tua. Comunque per chiarirmi meglio ti lascio un esempio :slight_smile: [spoiler]
K = 2
Sequenza: 4 3 2 9 6
Array di bool di dimensione 9
valore: F T T T F T F F T
indice: 1 2 3 4 5 6 7 8 9

Con un semplice ciclo, ti puoi accorgere che solo 4 e 6 vadano effettivamente rimossi
[/spoiler]

Nel caso d’esempio il tuo codice farebbe:

sol[0]=1;
sol[1]=sol[0]+1=2;
sol[2]=1;
sol[3]=sol[1]+1=3;

e fino a qua andrebbe anche bene, solo che quando arriva a sol[4], prende sol[3] come massimo dato che 4*2 non fa 5 e quindi sol[4]=sol[3]+1=4
peccato che sol[3] prende anche gli elementi 2 e 3 e in questo caso 2 non può stare con 4.
Nei tag c’è scritto programmazione dinamica ma a mio parere non si risolve così :confused:

4 Mi Piace

Ho pensato anch’io qualcosa del genere, però dovrei implementare 100000*100000 Bytes = 1,192 GB

Oppure ricorsivamente, oppure alla dijskra

Ho pensato anch’io qualcosa del genere, però dovrei implementare 100000*100000 Bytes = 1,192 GB

In realtà no, ti servono solamente 10^5 bool, anche dichiarando un array di bool non superi i 100KB :confused: