Cod sursa(job #1759588)

Utilizator felixiPuscasu Felix felixi Data 19 septembrie 2016 16:25:39
Problema PalM Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 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';
    }
}
 
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++) {
        mC[a][-1] = -1;
        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--) {
 
        if(mC[a][ln-1] == -1)
            continue;
 
        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);
                    }
 
                }
 
            }
 
        }
 
        //afis();
        //cout << '\n';
 
    }
 
    out << m[0][ln-1];
 
    return 0;
}