北航 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
#include <iostream>2
#include <string>3
#define MAXN 10054
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
else38

{39
if(dp_2[j+1] > dp_1[j])40

{41
dp_1[j+1] = dp_2[j+1];42
}43
else44

{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


