北航 1066 最長公共子序列的長度
//================================================================================//此題是求最長公共子學列,但是和一般題不同的是,內存卡的很嚴,是80kb,所以,要考慮狀態的壓縮,
//其實每次狀態轉移的時候都是用到了僅僅兩個狀態而已,故而用兩個數組就可以保存所有有用的狀態了
//開始想了好多的辦法,后來算了算,那些優化簡直可笑,不壓縮是不可能過的。
//================================================================================
1
#include <iostream>
2
#include <string>
3
#define MAXN 1005
4
using namespace std;
5
6
int dp_1[MAXN];
7
int dp_2[MAXN];
8
string s_1;
9
string s_2;
10
int main()
11

{
12
freopen("acm.acm","r",stdin);
13
int t;
14
int i;
15
int j;
16
cin>>t;
17
while(t --)
18
{
19
cin>>s_1;
20
cin>>s_2;
21
for(i = 0; i <= s_1.length(); ++ i)
22
{
23
dp_1[i] = 0;
24
}
25
for(j = 0;j <= s_2.length(); ++ j)
26
{
27
dp_2[j] = 0;
28
}
29
for(i = 0; i < s_1.length(); ++ i)
30
{
31
for(j = 0; j < s_2.length(); ++ j)
32
{
33
if(s_1[i] == s_2[j])
34
{
35
dp_1[j+1] = dp_2[j] + 1;
36
}
37
else
38
{
39
if(dp_2[j+1] > dp_1[j])
40
{
41
dp_1[j+1] = dp_2[j+1];
42
}
43
else
44
{
45
dp_1[j+1] = dp_1[j];
46
}
47
}
48
}
49
for(j = 0; j <= s_2.length(); ++ j)
50
{
51
dp_2[j] = dp_1[j];
52
}
53
}
54
//cout<<dp_1[s_1.length()]<<endl;
55
cout<<dp_1[s_2.length()]<<endl;
56
57
}
58
}
59
60
61
62

2

3

4

5

6

7

8

9

10

11



12

13

14

15

16

17

18



19

20

21

22



23

24

25

26



27

28

29

30



31

32



33

34



35

36

37

38



39

40



41

42

43

44



45

46

47

48

49

50



51

52

53

54

55

56

57

58

59

60

61

62
