题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1346
经典的LCS水题。。。
用来入门是极好的。也是我的第一道dp题。
但是一个非常坑的点是它的数据好像有单数组的,这意味着如果用while(gets(a))这样去做循环的话可能会出错,必须用两个串一起读入才行,这点上我被坑了几次。。。但貌似有人也用读单串去写却没有出错(见此),不知道是我判断错误还是其他问题。。。
还有一点,第一次做dp题,搞懂算法后却不知道如何读入字符串才能让数组第一位是0,最后是参考了别人代码后用gets(a+1)这种形式读入字符串,以及strlen(a+1)获取字符串长度,豁然开朗啊。
后来我又发现了其实可以正常去读入,在dp的时候对储存数组处理时下标都多+1就行了。。。
#include<cstdio> #include<cstring> #define MAXN 1010 char a[MAXN], b[MAXN]; int c[MAXN][MAXN]; int max(int a, int b) { if (a > b) return a; return b; } int main() { while (gets(a + 1) && gets(b + 1)) { int al = strlen (a + 1), bl = strlen (b + 1); memset(c, 0, sizeof(c)); for (int i = 1; i <= al; i++) for (int j = 1; j <= bl; j++) if (a[i] == b[j]) c[i][j] = c[i - 1][j - 1] + 1; else c[i][j] = max(c[i - 1][j], c[i][j - 1]); printf("%d\n", c[al][bl]); } return 0; }