Cod sursa(job #931568)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 28 martie 2013 12:45:05
Problema Subsir 2 Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>

using namespace std;

const int MAX_N = 5002;

int N, Max, Res;
int v[MAX_N], a[MAX_N], b[MAX_N], sol[MAX_N];

int main()
{
    ifstream f("subsir2.in");
    ofstream g("subsir2.out");

    f >> N;
    for(int i = 1; i <= N; ++i)
        f >> v[i];

    a[N] = 1;
    for(int i = N-1; i; --i)
    {
        Max = 0;
        for(int j = i + 1; j <= N; ++j)
            if(v[i] <= v[j] && a[j] > Max)
                Max = a[j];
        a[i] = Max + 1;
    }

    b[1] = 1;
    for(int i = 2; i <= N; ++i)
    {
        Max = 0;
        for(int j = 1; j < i; ++j)
            if(v[j] <= v[i] && b[j] > Max)
                Max = b[j];
        b[i] = Max + 1;
    }

    int p = 1;
    Res = a[1] + b[1] - 1;
    for(int i = 2; i <= N; ++i)
        if(a[i] + b[i] - 1 < Res)
            p = i, Res = a[i] + b[i] - 1;

    int lp = p;
    for(int k = b[p] - 1; k; --k)
    {
        for(int i = lp - 1; i; --i)
            if(b[i] == k && v[i] <= v[lp])
                lp = i;
        sol[k] = lp;
    }

    lp = p;
    sol[ b[p] ] = p;
    int t = b[p];
    for(int k = a[p] - 1; k; --k)
    {
        for(int i = lp + 1; i <= N; ++i)
            if(a[i] == k && v[lp] <= v[i])
            {
                lp = i;
                break;
            }
        sol[++t] = lp;
    }

    g << Res << '\n';
    for(int i = 1; i <= Res; ++i)
        g << sol[i] << " ";
    g << '\n';

    f.close();
    g.close();

    return 0;
}