Cod sursa(job #1661790)

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

using namespace std;

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

char s[503];
short m[503][503];
short p[503][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(int i = 0; i < ln-1; i++) {
        if(s[i] == s[i+1]) {
            m[i][i+1] = 2;
            p[i][i+1] = i;
        } else {
            m[i][i+1] = 1;
            p[i][i+1] = i;
        }
    }

    int P = 0;

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

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

            if(m[j+1][i+j] >= m[j][i+j-1]) {
                m[j][i+j] = m[j+1][i+j];
                P = p[j+1][i+j];
            } else {
                m[j][i+j] = m[j][i+j-1];
                P = p[j][i+j-1];
            }

            if(s[i+j] == s[j] && s[i+j] < s[P]) {

                p[j][i+j] = i+j;
                m[j][i+j] += 2;

            } else {

                p[j][i+j] = P;

            }

        }

    }

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

    return 0;
}