Cod sursa(job #1661817)

Utilizator razvandRazvan Dumitru razvand Data 24 martie 2016 10:52:37
Problema PalM Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in("palm.in");
ofstream out("palm.out");

char s[503];
int m[503][503];
int p[503][503];
int mC[26][503];
int ln;

void afis() {
    for(int i = 0; i < ln; i++) {
        for(int j = 0; j < ln; j++)
            cout << m[i][j] << " ";
        cout << '\n';
    }
    cout << '\n';
    for(int i = 0; i < ln; i++) {
        for(int j = 0; j < ln; j++)
            cout << p[i][j] << " ";
        cout << '\n';
    }
}

int main() {

    in.getline(s, 503);

    for(int i = 0; s[i]; i++) {
        //m[i][i] = 1;
        ln++;
    }

    for(char a = 'a'; a <= 'z'; a++) {
        for(int i = 0; i < ln; i++) {
            if(s[i] == a)
                mC[a][i] = i;
            else
                mC[a][i] = mC[a][i-1];
        }
    }

    for(char a = 'z'; a >= 'a'; a--) {

        for(int i = ln-1; i >= 0; i--) {

            for(int j = i; j < ln; j++) {

                if(i == j && s[i] == a)
                    m[i][j] = 1;
                else if(i != j && mC[a][j] > i) {

                    m[i][j] = max(m[i][j], max(m[i+1][j], m[i][j-1]));

                    if(s[i] == a)  {
                        m[i][j] = max(m[i][j], m[i+1][ mC[a][j]-1 ]+2);
                    }

                }

            }

        }

    }

    out << m[0][ln-1];

    return 0;
}