/* FILE: maxCommonSubsequence3.cpp last change: 23-Jan-2013 author: Romeo Rizzi * a cubic solver for problem maxCommonSubsequence3 */ #define NDEBUG // NDEBUG definita nella versione che consegno #include #ifndef NDEBUG # include // uso di cin e cout non consentito in versione finale #endif #include using namespace std; const int MAX_N = 100; // massima cardinalita' delle 3 stringhe in input char s1[MAX_N], s2[MAX_N], s3[MAX_N]; // le 3 stringhe in input int n1, n2, n3; // lunghezza delle 3 stringhe in input int opt[MAX_N +1][MAX_N +1][MAX_N +1]; /* opt[i][j][k] = the maximum length of a common subsequence of the three prefixes s1[0..i], s2[0..j] and s3[0..k]. */ int main() { ifstream fin("input.txt"); assert( fin ); fin >> n1 >> n2 >> n3; for(int i = 0; i < n1; i++) fin >> s1[i]; for(int i = 0; i < n2; i++) fin >> s2[i]; for(int i = 0; i < n3; i++) fin >> s3[i]; fin.close(); for(int i = n1; i >= 0; i--) for(int j = n2; j >= 0; j--) for(int k = n3; k >= 0; k--) if( (i == n1) || (j == n2) || (k == n3) ) opt[i][j][k] = 0; else if( s1[i] != s2[j] ) opt[i][j][k] = max( opt[i+1][j][k], opt[i][j+1][k] ); else if( s2[j] != s3[k] ) opt[i][j][k] = max( opt[i][j+1][k], opt[i][j][k+1] ); else // s1[i] == s2[j] == s3[k] opt[i][j][k] = 1 + opt[i+1][j+1][k+1]; ofstream fout("output.txt"); fout << opt[0][0][0] << endl; fout.close(); return 0; }