// FORONI MARCO vr090274 #include #include #define MAX_SIZE 100 #define UNKNOW -1 int Memo_MSC3(int i, int j, int k); int Max3(int a, int b, int c); int N1, N2, N3; char s1[MAX_SIZE]; char s2[MAX_SIZE]; char s3[MAX_SIZE]; int memo_msc[MAX_SIZE+1][MAX_SIZE+1][MAX_SIZE+1]; int main(){ FILE *fin = fopen("input.txt", "r"); // FILE *fin = fopen("input_gen.txt", "r"); assert(fin); fscanf(fin, "%d %d %d\n", &N1, &N2, &N3); int i; char car; for (i = 0; i < N1; i++) fscanf(fin, "%c", &s1[i]); fscanf(fin, "%c", &car); for (i = 0; i < N2; i++) fscanf(fin, "%c", &s2[i]); fscanf(fin, "%c", &car); for (i = 0; i < N3; i++) fscanf(fin, "%c", &s3[i]); fclose(fin); /* s1[N1] = '\0'; s2[N2] = '\0'; s3[N3] = '\0'; printf("\n%s\n%s\n%s\n", s1, s2, s3); */ // Inizializzazione memo: int j, k; for (i = 0; i <= N1; i++) for (j = 0; j <= N2; j++) for (k = 0; k <= N3; k++) memo_msc[i][j][k] = UNKNOW; int max_msc = Memo_MSC3(0, 0, 0); //printf("max_msc = %d.\n", max_msc); FILE *fout = fopen("output.txt", "w"); fprintf(fout, "%d\n", max_msc); fclose(fout); return (0); } int Memo_MSC3(int i, int j, int k){ if (i >= N1 || j >= N2 || k >= N3){ memo_msc[i][j][k] = 0; return memo_msc[i][j][k]; } // Se sono qui non ho finito le stringa if (s1[i] == s2[j] && s2[j] == s3[k]){ if (memo_msc[i+1][j+1][k+1] == UNKNOW) memo_msc[i+1][j+1][k+1] = Memo_MSC3(i+1, j+1, k+1); memo_msc[i][j][k] = 1 + memo_msc[i+1][j+1][k+1]; return memo_msc[i][j][k]; } if (memo_msc[i+1][j][k] == UNKNOW) memo_msc[i+1][j][k] = Memo_MSC3(i+1, j, k); if (memo_msc[i][j+1][k] == UNKNOW) memo_msc[i][j+1][k] = Memo_MSC3(i, j+1, k); if (memo_msc[i][j][k+1] == UNKNOW) memo_msc[i][j][k+1] = Memo_MSC3(i, j, k+1); // Se sono qui non sono uguali memo_msc[i][j][k] = Max3(memo_msc[i+1][j][k], memo_msc[i][j+1][k], memo_msc[i][j][k+1]); return memo_msc[i][j][k]; } int Max3(int a, int b, int c){ if (a < b) return (c > b) ? c : b; return (c > a) ? c : a; }