Cod sursa(job #1958020)

Utilizator bleo16783FMI Bleotiu Cristian bleo16783 Data 7 aprilie 2017 22:22:19
Problema Subsir 2 Scor 2
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <iostream>
#include<fstream>
using namespace std;
#define N 5005
int v[N],i,j,n,d[N],urmator[N],lmn,curr,trecut[N];
int sol[N],w[N],p[N];
void drum(int poz,int l)
{
    w[l]=v[poz];
    if(l>1)
        drum( trecut[poz] , l-1 );
}
void drum_poz(int poz,int l)
{
    p[l]=poz;
    if(l>1)
        drum_poz( trecut[poz] , l-1 );
}
void solve(int dim,int finish)
{
    bool ok=1;
    for(int i=1;i<=dim && ok;++i)
        if(sol[i]<w[i])
            return;
        else
            if(w[i]<sol[i])ok=0;
    if(!ok)
    {
        for(int i=1;i<=dim;++i)sol[i]=w[i];
        drum_poz(finish,dim);
    }
}
int main()
{
    ifstream f("subsir2.in");
    f>>n;
    for(i=1;i<=n;++i)f>>v[i];
    for(i=1;i<=n;++i)
    {
        lmn=N;curr=0;
        for(j=i-1;j>0;--j)
            if(v[j]<=v[i] && d[j]<lmn && v[j]>v[curr])
        {
            lmn=d[j];
            curr=j;
        }
        urmator[curr]=i;trecut[i]=curr;
        if(curr)d[i]=lmn+1;
            else d[i]=1;
    }
    curr=N;
    for(i=1;i<=n;++i)
        if(curr>d[i] && !urmator[i])
        curr=d[i];
    ofstream g("subsir2.out");
    g<<curr<<'\n';
    sol[1]=5000;
    for(i=1;i<=n;++i)
        if(d[i]==curr && !urmator[i])
    {
        drum(i,curr);
        solve(curr,i);
    }
    for(i=1;i<=curr;++i)g<<p[i]<<" ";
    return 0;
}