rendered paste body//Longest ascending subsequence
#include <
fstream>
#include <
iostream>
#include <
vector>
using namespace std;
vector<
int>
vPred;
vector<
int>
a,v;
int imax;
void readData(ifstream& in)
{
int aux;
int i=1;
while(!in.eof())
{
in >
>
aux;
a.push_back(aux);
//Az a vektorba lessz az eredeti sorozat
}
}
void process()
{
int j,i,n;
v.push_back(1);
//A legelso elemnel 1 a hossza a sorozatnak
vPred.push_back(-1);
//A legelso elem elott nincs semmi
imax=0;
n=(int) a.size();
for(i=1;i<n;i++)
{
v.push_back(1);
//az illeto elemet 1 re inicializaljuk
vPred.push_back(-1);
// az illeto elemnel -1 re inicializalunk majd ugyis atirjuk ha kell
for(j=0;j<i;j++)
{
if(a[j]<a[i] && v[j]+1>v[i]) // novekvo legyen es nagyobb mint az eddigi maximalis
{
v[i]=v[j]+1;
//noveljuk
vPred[i]=j;
//megjegyezuk a helyet hogy majd visszakereshessuk
}
}
if(v[i]>v[imax]) imax=i;
//uj maximalis ertekunk van, megjegyezzuk
}
}
void recoverSubstring(int i, ofstream &out)
{
//out << "Recovering substring..."<<endl;
if(vPred[i]+1!=0)
{
//out << "vPred["<<i<<"]+1!=0->"<<vPred[i]<<endl;
recoverSubstring(vPred[i],out);
}
//else out << "vPred["<<i<<"]+1=0->"<<vPred[i]<<endl;
out <
<
a[i] <
<
"
"
;
}
void writeData(ofstream &out)
{
out <
<
"
v:"
;
for(int i=0;i<(int)v.size()-1;i++) out <
<
v[i] <
<
"
"
;
out <
<
endl;
out <
<
"
vPred:"
;
for(int i=0;i<(int)vPred.size()-1;i++) out <
<
vPred[i] <
<
"
"
;
out <
<
endl;
out <
<
"
Hossza:"
;
out <
<
v[imax] <
<
endl;
out <
<
"
A sorozat: "
;
recoverSubstring(imax,out);
out <
<
endl<
<
"
Az eredeti:"
;
for(int i=0;i<(int)a.size()-1;i++) out <
<
a[i] <
<
"
"
;
}
int main()
{
ifstream in("ascending.in");
ofstream out("ascending.out");
readData(in);
process();
writeData(out);
return 0;
}