Cod sursa(job #2633087)

Utilizator CraniXortDumitrescul Eduard CraniXort Data 6 iulie 2020 14:13:19
Problema Elimin 2 Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <bits/stdc++.h>
#define maxn 2005

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

std::string a;
int dp[maxn][maxn], n;
int left[maxn][10], right[maxn][10];

void print (int l, int r, int len){
    if (len <= 0)
        return;
    for (int i=9; i>=0; i--){
        if (dp[right[l][i]][left[r][i]] == len){
            fout << i;
            print (right[l][i]+1, left[r][i]-1, len-2);
            if (len > 1)
                fout << i;
            return;
        }
    }
}

int main()
{
    int i, j, len;
    fin >> a;
    n = a.size();
    for (i=1; i<=n; i++){
        for (j=0; j<=9; j++)
            left[i][j] = left[i-1][j];
        left[i][a[i-1]-'0'] = i;
    }

    for (i=n; i>=1; i--){
        for (j=0; j<=9; j++)
            right[i][j] = right[i+1][j];
        right[i][a[i-1]-'0'] = i;
    }

    for (i=1; i<=n; i++)
        dp[i][i] = 1;

    for (len=1; len<n; len++){
        for (i=1; i+len <= n; i++){
            j = i + len;
            if (a[i-1] == a[j-1])
                dp[i][j] = dp[i+1][j-1] + 2;
            else
                dp[i][j] = std::max (dp[i+1][j], dp[i][j-1]);
        }
    }

    int max = 0;
    for (i=1; i<9; i++)
        max = std::max (max, dp[right[1][i]][left[n][i]]);
    //fout << max << '\n';

    print (1, n, max);


    return 0;
}