Bug in Sushi Variegato (Yutaka)

Codice:

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define nl '\n'
#define ll long long
const int mod = 1e9 + 7;
const int mxn = 1e6 + 100;
int taglia(int N, int V[]) {
	ll dp[N+1];
	ll pref[N+1];
	memset(dp, 0, sizeof(dp));
	memset(pref, 0, sizeof(pref));
	dp[0] = 1;
	pref[0] = 1;
	vector<int> lastSeen(mxn, -1);
	int lastD = 0;
	for (int i = 1; i <= N; i++) {
		// Devo confrontare questo con il massimo tra lastD e l'ultima istanza trovata di se' stesso
		lastD = max(lastSeen[V[i-1]], lastD);
		dp[i] = pref[i-1] - (lastD ? pref[lastD-1] : 0);
		dp[i] %= mod;
		pref[i] = pref[i-1] + dp[i];
		pref[i] %= mod;
		lastSeen[V[i-1]] = i;
	}
	return dp[N];
}

Credo che l’idea sia corretta. La spiego per chiarezza:
dp[i] = numero di modi di dividere l’array fino alla posizione i-1
Posso porre divisioni all’array in tutte le posizioni precedenti, fino alla ultima posizione in cui un piatto sarebbe ripetuto.
Uso prefix sum per velocizzare questa somma.
Eppure questo codice prende 53/100, qualcuno puo’ consigliarmi cosa c’e’ di sbagliato?
Grazie :slight_smile:

Il problema è che in dp[i] la differenza può risultare negativa. Basta solo correggere quel punto.

1 Mi Piace

Riusciresti a fornirmi un esempio? Non riesco a capire come sia possibile…
Upd: ok ho inserito un controllo ed effetitvamente puo’ diventare negativo
Ora devo capire come sia possible ahahahah
Ahhh ho capito!
Siccome prendo il modulo, potrebbe succedere una iterazione porta la pref sum sopra a mod, e quindi viene ridotta considerevolmente, e se dopo sottraggo tale ridotta pref sum con una precedente “non ridotta”, il risultato diventa negativo. Grazie mille!