Mh sì penso che tu stia scegliendo in modo greedy il numero di antipasti presi (ma in realtà anche quello dei primi), mentre dovresti controllare per tutti i possibili valori. Cioè se guardi bene la ricorsiva prima richiama f(0,j+1)
finché può quindi quando per la prima volta richiamerai f(1,0)
ti calcolerai la risposta avendo preso j
antipasti, ma per come hai fatto la dp non te la ricalcolerai più, questo non sarebbe un problema se la scelta dei primi fosse indipendente dalla scelta degli antipasti, purtroppo però non lo è.
Questo non era un problema della soluzione precedente che, non aggiornando mai dp[i][j]
finiva per calcolarsi tutte le possibilità, anche se in un tempo spropositato, la soluzione che aggiorna la dp sbaglia anche il secondo caso d’esempio per il motivo che ti ho detto.
Io personalmente sono partito dalla bruteforce in N^3, l’ho ricondotta a una N^2 che poi è diventata una NlogN con l’aiuto di qualche struttura dati, oppure puoi usare il metodo brionix, sicuramente geniale anche se molto ad hoc