Cod sursa(job #2794039)

Utilizator Vlad_AnicaAnica-Popa Vlad-Ioan Vlad_Anica Data 4 noiembrie 2021 11:35:53
Problema Elimin 2 Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.03 kb
#include <stdio.h>
#include <ctype.h>

using namespace std;
const int NMAX = 2001;

char cf[NMAX], sol[NMAX], dpcfmax[NMAX][NMAX];
int dplmax[NMAX][NMAX];
int i;

char mymax(char a, char b);
int read();
void cmpRpl(int lcur, int cfcur, int &lmax, char &cmax);
void initDP(int n, int &lmax, char &cfmax);
void solve(int lmax, char cfmax, int n);
void print(int lmax);


int main()
{
    int n, lmax;
    char cfmax;

    n = read();
    initDP(n, lmax, cfmax);
    solve(lmax, cfmax, n);
    print(lmax);

    return 0;
}

char mymax(char a, char b)
{
    if (a > b)
        return a;
    return b;
}
int read()
{
    int len = 0;
    char ch;
    FILE *fin = fopen("elimin2.in", "r");
    while (isdigit(ch = fgetc(fin)))
        cf[len++] = ch;
    fclose(fin);
    return len;
}
void cmpRpl(int lcur, char cfcur, int &lmax, char &cfmax)
{
    if (lcur > lmax)
    {
        lmax = lcur;
        cfmax = cfcur;
    }
    else if (lcur == lmax && cfcur > cfmax)
        cfmax = cfcur;
}
void initDP(int n, int &lmax, char &cfmax)
{
    int j, l;
    lmax = 1;
    cfmax = '0';
    for (i = 0; i < n - 1; i++)
    {
        dplmax[i][i] = 1;
        dpcfmax[i][i] = cf[i];
        if (lmax == 1)
            cfmax = mymax(cfmax, cf[i]);
        if (cf[i] == cf[i + 1])
        {
            dplmax[i][i + 1] = 2;
            dpcfmax[i][i + 1] = cf[i];
            if ((cf[i] > '0' && lmax == 1) || (lmax == 2 && cf[i] > cfmax))
            {
                lmax = 2;
                cfmax = cf[i];
            }
        }
        else
        {
            dplmax[i][i + 1] = 1;
            dpcfmax[i][i + 1] = mymax(cf[i], cf[i + 1]);
        }
    }
    dplmax[n - 1][n - 1] = 1;
    dpcfmax[n - 1][n - 1] = cf[n - 1];
    if (lmax == 1)
        cfmax = mymax(cfmax, cf[i]);


    for (l = 2; l < n; l++)
        for (i = 0; i < n - l; i++)
        {
            j = i + l;
            cmpRpl(dplmax[i + 1][j], dpcfmax[i + 1][j], dplmax[i][j], dpcfmax[i][j]);
            cmpRpl(dplmax[i][j - 1], dpcfmax[i][j - 1], dplmax[i][j], dpcfmax[i][j]);
            if (cf[i] == cf[j])
                cmpRpl(dplmax[i + 1][j - 1] + 2, cf[i], dplmax[i][j], dpcfmax[i][j]);
            if (dpcfmax[i][j] > '0')
            {
                if (dplmax[i][j] > lmax)
                {
                    lmax = dplmax[i][j];
                    cfmax= dpcfmax[i][j];
                }
                else if (dplmax[i][j] == lmax)
                    cfmax = mymax(dpcfmax[i][j], cfmax);
            }

        }
}
void solve(int lmax, char cfmax, int n)
{
    int st, dr, posSt, posDr;
    posSt = 0, posDr = lmax - 1, st = 0, dr = n - 1;
    while (posSt <= posDr)
    {
        while (cf[st++] != cfmax);
        while (cf[dr--] != cfmax);
        sol[posSt++] = sol[posDr--] = cfmax;
        cfmax = dpcfmax[st][dr];
    }
}
void print(int lmax)
{
    FILE *fout = fopen("elimin2.out", "w");
    for (int i = 0; i < lmax; i++)
        fputc(sol[i], fout);
    fclose(fout);
}