HDU 1159 Common Subsequence

  这一题算是一道典型的裸睡(又裸又水)题了吧,不过用刚学的滚动数组进行了优化,时间跟空间复杂度大幅度下降,如果字符长度超过5000的话恐怕不进行优化是要MLE的,不多说了,看代码吧。。。

状态f[i][j]表示检查到Ai跟Bj时的最长公共子序列的长度,如果Ai = Bj,那么f[i][j] = f[i - 1][j - 1] + 1,否则考虑三种情况:(1)Ai在公共子序列中,Bj不在, f[i][j - 1];(2)Bi在公共子序列中,Ai不在, f[i - 1][j];(3)Ai跟Bi都不在,f[i - 1][j - 1]。由于第三种情况一定小于前两种情况,故f[i][j] = max{f[i - 1][j], f[i][j - 1]}。

AC code:

View Code
 1 #include <iostream>
2 #include <cstring>
3 #define MAX 2000
4 using namespace std;
5 int maxlen[2][MAX];
6 char s1[MAX], s2[MAX];
7 int main()
8 {
9 while(scanf("%s%s", s1 + 1, s2 + 1) != EOF)
10 {
11 int i, j;
12 int len1, len2;
13 int e = 0;
14 len1 = strlen(s1 + 1);
15 len2 = strlen(s2 + 1);
16 memset(maxlen, 0, sizeof(maxlen));
17 for(i = 1; i <= len1; i++)
18 {
19 e = 1 - e;//用到了滚动数组
20 for(j = 1; j <= len2; j++)
21 {
22 if(s1[i] == s2[j])//注意要i、j要从1开始,不然下一步会wa
23 maxlen[e][j] = maxlen[1 - e][j - 1] + 1;
24 else
25 maxlen[e][j] = maxlen[1 - e][j] > maxlen[e][j - 1] ? maxlen[1 - e][j] : maxlen[e][j - 1];
26 }
27 }
28 printf("%d\n", maxlen[e][len2]);
29 }
30 return 0;
31 }



posted @ 2012-03-06 16:54  背着超人飞  阅读(179)  评论(0)    收藏  举报