Pagini recente » Cod sursa (job #1560572) | Cod sursa (job #1066212) | Romanian IOI Medalists: Careers | Cod sursa (job #3161241) | Cod sursa (job #2759499)
void scmax(int n, vector<int> &v) {
vector<int> dp(n + 1); // în explicații indexarea începe de la 1
// caz de bază
dp[1] = 1; // [ v[1] ] este singurul subșir (crescător) care se termină pe 1
// caz general
for (int i = 2; i <= n; ++i) {
dp[i] = 1; // [ v[i] ] - este un subșir (crescător) care se termină pe i
// încerc să îl pun pe v[i] la finalul tuturor soluțiilor disponibile
// o soluție se termină cu un element v[j]
for (int j = 1; j < i; ++j) {
// soluția trivială: v[i]
if (v[j] < v[i]) {
// din (..., v[j]) pot obține (..., v[j], v[i])
// (caz în care prec[i] = j)
// voi alege j-ul curent, când alegerea îmi găsește o soluție mai bună decât ce am deja
if (dp[j] + 1 > dp[i]) {
dp[i] = dp[j] + 1;
}
}
}
}
// soluția e maximul din vectorul dp
int sol = dp[1], pos = 1;
for (int i = 2; i <= n; ++i) {
if (dp[i] > sol) {
sol = dp[i];
pos = i;
}
}
return sol;
}