Cod sursa(job #1731169)

Utilizator borcanirobertBorcani Robert borcanirobert Data 18 iulie 2016 14:37:21
Problema Elimin 2 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <fstream>
#include <cstring>
using namespace std;

ifstream fin("elimin2.in");
ofstream fout("elimin2.out");

const int MAX = 2016;
short D[MAX][MAX];
int N;
char a[MAX];
short st[10][MAX];
short dr[10][MAX];
short L;

void Write( int s, int d, int L );

int main()
{
    int i, j, l;

    fin.getline(a + 1, MAX);
    N = strlen(a + 1);

    for ( i = 1; i <= N; i++ )
        D[i][i] = 1;

    for ( l = 2; l <= N; l++ )
        for ( i = 1; i <= N - l + 1; i++ )
        {
            j = i + l - 1;

            D[i][j] = max( D[i + 1][j], D[i][j + 1] );
            if ( a[i] == a[j] )
                D[i][j] = max( (int)D[i][j], D[i + 1][j - 1] + 2 );
        }

    for ( i = 0; i <= 9; i++ )
    {
        for ( j = 1; j <= N; j++ )
        {
            if ( a[j] - '0' == i )
                st[i][j] = j;
            else
                st[i][j] = st[i][j - 1];
        }

        dr[i][N + 1] = N + 1;
        for ( j = N; j >= 1; j-- )
        {
            if ( a[j] - '0' == i )
                dr[i][j] = j;
            else
                dr[i][j] = dr[i][j + 1];
        }
    }

 /*   for ( i = 1; i <= N; i++ )
    {
        for ( j = 1; j <= N; j++ )
            fout << D[i][j] << ' ';
        fout << '\n';
    }
  //  return 0; */

    L = 1;
    for ( i = 1; i <= 9; i++ )
        L = max( L, D[dr[i][1]][st[i][N]] );

    Write(1, N, L);

    fin.close();
    fout.close();
    return 0;
}

void Write( int s, int d, int L )
{
    int i;

    if ( L <= 0 ) return;
 //   if ( L == 6 )
  //      fout << "DA";

    for ( i = 9; i >= 0; i-- )
    {
        if ( D[dr[i][s]][st[i][d]] != L )
            continue;

        fout << i;

        Write( dr[i][s] + 1, st[i][d] - 1, L - 2 );

        if ( L > 1 )
            fout << i;

        return;
    }
}