Back to list of problems
History Grading
111.c
#include <stdio.h> #include <string.h> int n; int orig[25]; int dest[25]; int tab[25][25]; #define MAX(a,b) ((a) > (b) ? (a) : (b)) int lcs(int a, int b) { int i,j; if (a==0 || b==0) { return 0; } if (tab[a][b]) { return tab[a][b]; } if (orig[a] == dest[b]) { tab[a][b]=1+lcs(a-1,b-1); return tab[a][b]; } i = lcs(a-1,b); j = lcs(a,b-1); tab[a][b] = MAX(i,j); return tab[a][b]; } int main(void) { int i; int a; scanf("%d", &n); for (i=1; i<=n; i++) { scanf("%d", &a); orig[a] = i; } while (1) { for (i=1; i<=n; i++) { if (scanf("%d", &a) != 1) { return 0; } dest[a] = i; } memset(tab, 0, sizeof(tab)); printf("%d\n", lcs(n, n)); } }