Cod sursa(job #2537353)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 3 februarie 2020 16:27:07
Problema PalM Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <bits/stdc++.h>
#define DIMN 510
using namespace std;
int v[DIMN] , close_l[DIMN][30] , close_r[DIMN][30] , last[30] , dp[DIMN][DIMN];
int main()
{
    FILE *fin = fopen ("palm.in","r");
    FILE *fout = fopen ("palm.out","w");
    int n , i ,j , len , sol = 0, c;
    char ch;
    n = 0;
    ch = fgetc(fin);
    while ('a' <= ch && ch <='z'){
        v[++n] = ch - 'a';
        ch = fgetc(fin);
    }

    for (i = n ; i ; i--){
        for (c = 0 ; c <= 'z' - 'a' ; c++){
            if (last[c] == 0)
                close_r[i][c] = n + 1;
            else close_r[i][c] = last[c];
        }
        last[v[i]] = i;
    }

    memset (last , 0 , sizeof(last));

    for (i = 1 ; i<=n ; i++){
        for (c = 0 ; c <= 'z' - 'a' ; c++){
            if (last[c] == 0)
                close_l[i][c] = 0;
            else close_l[i][c] = last[c];
        }
        last[v[i]] = i;
    }
    for (i = 1; i <= n ; i++){
        dp[i][i] = 1; /// lmax
        if (i != n && v[i] == v[i+1])
            dp[i][i+1] = 2;
    }

    for (len = 1; len <= n ; len++){
        for (i = 1; i + len - 1 <= n ; i++){
            for (c = 0 ; c <= v[i] ; c++){
                if (close_l[i][c] != 0 && close_r[i + len-1][c] != n + 1){
                    dp[close_l[i][c]][close_r[i + len-1][c]] = max(dp[close_l[i][c]][close_r[i + len-1][c]] , 2 + dp[i][i + len - 1]);
                }
            }
        }
    }
    sol = 0;
    for (i=1;i<=n;i++){
        for (j=1;j<=n;j++)
            sol = max(sol , dp[i][j]);
    }
    fprintf (fout,"%d",sol);
    return 0;
}