Pagini recente » Cod sursa (job #1615369) | Cod sursa (job #549343) | Cod sursa (job #2161119) | Cod sursa (job #716319) | Cod sursa (job #1427994)
#include <iostream>
#include <fstream>
using namespace std;
const int MAXN=100005;
ifstream in("scmax.in");
ofstream out("scmax.out");
int A[MAXN];
int dp[MAXN];
int prec[MAXN];
int subsir[MAXN];
int main()
{
int n;
in>>n;
for(int i=1;i<=n;i++)
in>>A[i];
int mx_val=1;
int mx_poz=1;
for(int i=1;i<=n;i++)
{
//luam elementul A[i]
dp[i]=1;
for(int j=1;j<i;j++)
{
//dp[i] = 1+max(dp[j]) , A[j]<A[i]
if(A[j]<A[i])
if(dp[i] < 1+dp[j]) {
dp[i]=dp[j]+1;
prec[i] = j;
}
}
/// a : 1 2 3 4 7 1 2
/// dp 1 2 3 4 5 1 2
/// prec: 0 1 2 3 4 0 6
/// a: 10 5 7 1 2 0 5
/// dp: 1 1 2 1 2 1 3
/// prec: 0 0 2 0 4 0 5
/// s-a terminat forul, avem calculat dp[i]
if(dp[i]>mx_val)
{
mx_val=dp[i];
mx_poz=i;
}
}
out<<mx_val<<"\n";
int pozact=mx_poz;
while(pozact>0)
{
subsir[dp[pozact]]=A[pozact];
pozact=prec[pozact];
}
for(int i=1;i<=mx_val;i++)
out<<subsir[i]<<" ";
return 0;
}