Word Game 20/100

Ciao a tutti, ho provato a risolvere questo problema in maniera ricorsiva, tecnica su cui non sono ancora molto ferrato.
Praticamente sorto l’array di stringhe in ordine decrescente per lunghezza e in ordine alfabetico nel caso di stringhe di stessa lunghezza, per poi trovare la sequenza di lunghezza massima partendo da ogni parola e stampare il massimo di questi valori.

Mi sono scervellato per ore ma niente, mi ritrovo costretto a chiedere aiuto :blush:
Il “bello” è che il caso di esempio mi restituisce 6 invece che 7, però scrivendo in input solo le parole che compongono la sequenza massima viene giusto lol.
Qua il codice: https://pastebin.com/VdLCCQd9

L’ordine è corretto ma sei sicuro che ti serva una ricorsiva? Non potrebbero bastare 2 for innestati?:wink:

2 Mi Piace

Grazie della risposta, ma non capisco proprio come intendi :sweat_smile:
Come fanno a bastare solo 2 for se da ogni parola se ne può derivare più di una e da ognuna di queste se ne possono derivare altre, e così via? Non ci vorrebbero k for in tal caso se la lunghezza della sequenza è k?

Partiamo dal presupposto di ordinare, come detto in precedenza, le stringhe in ordine decrescente di lunghezza e le stringhe della stessa lunghezza le ordiniamo in ordine alfabetico.

La sequenza s:
abacd bcdada dd abcd bcdd adcd addd aa ccd add ad
si trasforma in:
bcdada abacd abcd adcd addd bcdd add ccd aa ad dd

Se adesso consideriamo le condizioni imposte dall’esercizio per muoverci da una parola ad un’altra, ossia:

• w2 is obtained from w1 by deleting one letter.
• w2 is obtained from w1 by replacing one of the letters
in w1 by some letter that appears to its right in w1 and which is also to its right in alphabetical
order.

Possiamo notare che partendo da una delle nostre stringhe possiamo “saltare” solamente su delle stringhe alla sua destra.

Quello che diventa utile fare è tenersi un array(solitamente chiamato soluzioni), nel quale ad ogni casella i andremo ad inserire la lunghezza della sequenza più lunga che termina in i.

int soluzioni[MAXN];
for(int i=0;i<n;i++)                 soluzioni[i]=1;       //sicuramente una sequenza che comprende la stringa i è lunga al minimo 1(solo lei stessa)

Quello che possiamo sicuramente dire riguardo a questo esercizio è: se dalla stringa i che sto analizzando posso arrivare alla stringa j allora posso dire che una sequenza che termina in j è lunga soluzioni[i]+1, quindi la sequenza che finiva con la stringa i ma aggiungendogli anche la stringa j.

Guarda se ti bastano queste indicazioni per trovare la soluzione altrimenti guarda pure lo spoiler che però rivela gran parte della soluzione.

Esempio:

bcdada abacd abcd adcd addd bcdd add ccd aa ad dd

I due cicli possono essere visti come:

for(int i=1;i<n;i++)
   for(int j=0;j<i;j++)
           if(jump(j,i)==true  && soluzioni[j]>=soluzioni[i])
                  soluzioni[i]=soluzioni[j]+1;

Come detto le soluzioni di queste stringhe partono inizialmente da 1:
parto analizzando la seconda stringa quindi abacd, è “concatenabile” con la stringa in posizione 0? La risposta è no, quindi la sequenza più lunga che finisce in abacd è lunga 1(la strinfa stessa)

La i aumenta a 2, parto sempre confrontando con la numero 0:
partendo dalla stringa 0 posso arrivare alla 2?No, quindi nulla
partendo dalla stringa 1 posso arrivare alla 2?La risposta è si, allora la sequenza di lunghezza massima che termina con la stringa numero 2 sarà lunga 2( soluzioni[j]+1).

continuo a ripetere questo procedimento per ogni valore, alla fine la soluzione del nostro problema sarà data dal valore massimo inserito all’interno dell’array soluzioni.

Spero di essere stato il più chiaro possibile.

2 Mi Piace

Grazie mille, chiarissimo :sunglasses: