Pagini recente » Cod sursa (job #535373) | Cod sursa (job #2697710) | Borderou de evaluare (job #1330307) | Cod sursa (job #2618194) | Cod sursa (job #3003710)
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1e5;
int v[nmax+5];
int dp[nmax+5], prv[nmax+5];
// dp[i] - lungimea celui mai lung scmax care se termina cu v[i]
int sol[nmax+5];
int main() {
ifstream f("scmax.in");
ofstream g("scmax.out");
int n; f >> n;
for(int i=1; i<=n; i++) f >> v[i];
int ans = 0, pos;
for(int i=1; i<=n; i++) {
int ret = 0;
int mx = 0;
for(int j=1; j<i; j++)
if(v[j] < v[i] and dp[j] > mx) {
mx = dp[j];
ret = j;
}
dp[i] = mx + 1;
prv[i] = ret;
if(dp[i] > ans) {
ans = dp[i];
pos = i;
}
}
for(int i=1; i<=ans; i++) {
sol[i] = pos;
pos = prv[pos];
}
g << ans << "\n";
for(int i=ans; i>=1; i--) g << v[sol[i]] << " ";
return 0;
}