Pagini recente » Cod sursa (job #553843) | Cod sursa (job #2493116) | Cod sursa (job #664202) | Cod sursa (job #2815779) | Cod sursa (job #2260895)
/// http:///www.infoarena.ro/problema/scmax
/// 70 p pe infoarena, doar pentru ilustrarea programarii dinamice
#include <fstream>
using namespace std;
ifstream fi("scmax.in");
ofstream fo("scmax.out");
int l[100001], a[100001], n, lmax, imax;
void citeste () {
int i;
fi >> n;
for (i = 1; i <= n; i++)
fi >> a[i];
}
void dinamic() {
int ml, i, j;
/// ml - maximul lungimilor subsirurilor crescatoare care incep dupa pozitia "i" cu un element > a[i]
l[n] = 1; /// initializare
for (i = n-1; i >= 1; i--) { /// pentru fiecare element din sir
ml = 0; /// initializarea maximului
for (j = i+1; j <= n; j++) /// pentru fiecare element din dreapta elementului curent
if (a[i] < a[j] and l[j] > ml) /// Sunt indeplinite conditiile?
ml = l[j]; /// Actualizam maximul lungimilor subsirurilor care incep dupa elementul curent.
l[i] = ml+1; /// lungimea celui mai lung subsir care incepe pe locul i
}
}
void maxim () {
int i;
lmax = l[1]; imax = 1;
for (i = 1; i <= n; i++)
if (l[i] > lmax) {
lmax = l[i]; imax = i;
}
}
void scrie() {
int i, is, id;
fo << lmax << endl; /// Afisam lungimea maxima.
fo << a[imax] << ' '; /// primul element din subsir
for (is = imax, id = is+1; id <= n; id++) /// indici pentru elementele unei perechi: stanga, dreapta
if (a[is] < a[id] and l[id] == l[is]-1) { /// Suntem la urmatorul element din subsirul cautat?
fo << a[id] << ' '; /// Scriem elementul.
is = id; /// Pregatim indicelele stanga din urmatoarea pereche.
}
}
//void scrie() {
// int i;
//
// fo << lr << endl;
// for (i = imax; i <= n; i++)
// if ((a[i] >= a[imax]) and (lr == l[i])) {
// fo << a[i] << ' ';
// lr--;
// }
//}
int main() {
citeste();
dinamic();
maxim();
scrie();
return 0;
}