Pagini recente » Cod sursa (job #2467458) | Cod sursa (job #687982) | Cod sursa (job #2701429) | Borderou de evaluare (job #1303721) | Cod sursa (job #360342)
Cod sursa(job #360342)
/*
a= 3 1 5 4 2 7 3 4 9 8 9 5 1
lis= 5 6 4 4 5 3 4 3 2 2 1 1 1
pred= 3 5 6 6 7 11 8 9 11 11 inf inf inf
lis[i]= lungimea maxima a unui subsir din a[i...n] si care incepe la poz i
pred[i]=j : a[i] este inaintea lui a[j] in subsirul maximal
*/
#include<fstream>
using namespace std ;
int a[10001],lis[10001], n , pred[10001], sol[10001];
// pred[i] = p : a[i] are pe a[p] ca predecesor in sirul de lungime maxima
void ReadData()
{
int i ;
ifstream f("scmax.in") ;
f>>n ;
for (i=1 ; i<=n ; i++)
f>>a[i] ;
f.close() ;
}
void LIS1()
{
int i, j, max, p,min ;
lis[n] = 1 ;
pred[n] = 0;
for (i=n-1 ; i>=1 ; i--)
{
max = 0 ; p = -1 ; min = 10000001 ;
for (j=i+1 ; j<=n ; j++)
if ((a[i]<=a[j]) && (max <= lis[j])&&(min > a[j]))
{
max = lis[j] ; p = j ; min = a[j] ;
}
lis[i] = 1 + max ;
if (p != -1) pred[i] = p ;
else pred[i] = 0 ;
}
}
void PrintSol1()
{
int i,max,p, k,min ;
ofstream f("scmax.out") ;
max = 0 ; min = 1000001 ;
for (i=1 ; i<=n ; i++)
if (max < lis[i]) { max = lis[i] ; p = i ; min = a[i] ;}
else if ((max == lis[i])&&(min > a[i]))
{
p = i ; min = a[i] ;
}
f<<max<<"\n" ;
k = 0 ;
while (p > 0)
{
sol[++k] = a[p] ;
p = pred[p] ;
}
for (i=1 ; i<=k ; i++) f<<sol[i]<<" " ;
f.close() ;
}
int main()
{
ReadData() ;
LIS1() ;
PrintSol1() ;
return 0 ;
}