/* ACM 10192 Vacation * mythnc * 2012/01/09 18:05:11 * run time: 0.004 */ #include <stdio.h> #include <string.h> #define MAXCHAR 102 /* 100 + '\n' + '\0' */ #define MAX(X, Y) (X >= Y ? X : Y) void lcs(char *, char *, int, int); /* 0~100: totally 100 + 1 */ int list[MAXCHAR - 1][MAXCHAR - 1]; int main(void) { char s1[MAXCHAR], s2[MAXCHAR]; int set, n1, n2; set = 0; while (fgets(s1, MAXCHAR, stdin) && s1[0] != '#') { fgets(s2, MAXCHAR, stdin); n1 = strlen(s1); /* eat '\n' */ s1[n1] = '\0'; n1--; n2 = strlen(s2); s2[n2] = '\0'; n2--; lcs(s1, s2, n1, n2); /* output */ printf("Case #%d: you can visit at most %d cities.\n", ++set, list[n1][n2]); } return 0; } /* lcs: use DP to find longest len */ void lcs(char *s1, char *s2, int n1, int n2) { int i, j; char tmp[MAXCHAR]; /* start from [1] to save data */ /* so move data from 0~n to 1~(n + 1) */ strcpy(tmp, s1); strcpy(s1 + 1, tmp); strcpy(tmp, s2); strcpy(s2 + 1, tmp); /* set list[x][0] and list[0][x] to zero */ for (i = 0; i <= n1; i++) list[i][0] = 0; for (i = 1; i <= n2; i++) list[0][i] = 0; for (i = 1; i <= n1; i++) for (j = 1; j <= n2; j++) if (s1[i] == s2[j]) list[i][j] = list[i - 1][j - 1] + 1; else list[i][j] = MAX(list[i - 1][j], list[i][j - 1]); }
20120109
ACM 10192 Vacation
同ACM10405。
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言