Pagini recente » Cod sursa (job #2685711) | Cod sursa (job #3154034) | Cod sursa (job #2093289) | Cod sursa (job #2697431) | Cod sursa (job #2910099)
//Problema scmax - Rezolvare C++: 70p -> infoarena.ro
//Stud. Cristian CRIȘAN - AC, CTI-RO, ANUL I
#include <iostream>
#include <fstream>
#define NR_OF_ELEMENTS 100005
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
void Read(int &n, int a[])
{
int i;
fin >> n;
for(i = 1; i <= n; ++ i)
fin >> a[i];
}
void Solve(int n, int a[])
{
int i, dp[NR_OF_ELEMENTS], t[NR_OF_ELEMENTS], j, sol = 0, u = 0; //dp - lungimi, t - indici
for(i = n - 1; i >= 1 ; -- i)
for(j = i + 1; j <= n ; ++ j) //se formeaza toate sumele partiale posibile de la coada la cap
if(a[i] < a[j])
if(dp[i] <= dp[j])
{
dp[i] = dp[j] + 1; //daca elementul este mai mic decat cel din fata sa se adauga 1 la lungime
t[i] = j; //se retine indicele final corespunzator sirului maximal care incepe de la indicele i
}
for(i = 1; i <= n; ++ i) //gasirea lungimii maxime
if(sol < dp[i])
{
sol = dp[i];
u = i;
}
fout << sol + 1 << '\n';
i = u;
while(i) //afisarea efectiva a solutiei
{
fout << a[i] << ' ';
i = t[i];
}
fout << '\n';
}
int main()
{
int a[NR_OF_ELEMENTS], n;
Read(n, a);
Solve(n, a);
return 0;
}