NYOJ 36最长公共子序列
1 /*******************************************************
2 状态转移方程:
3 s1[i] == s2[j] 时,same[i,j] = 1;
4 ans = max(a[i][j]+same[i,j], a[i][j-1], a[i-1][j])
5
6 *****************************************************/
7 #include<iostream>
8 #include<cstring>
9 #include<string>
10 using namespace std;
11 #define N 1005
12 int a[N][N];
13 string s1,s2;
14
15 void dp()
16 {
17 int i,j;
18 memset(a,0,sizeof(a));
19 for(i = 0; i < s1.length(); i++)
20 for(j = 0; j < s2.length(); j++)
21 {
22 if(s1[i] == s2[j]) a[i+1][j+1] = a[i][j] + 1;
23 else a[i+1][j+1] = a[i+1][j]>a[i][j+1]?a[i+1][j]:a[i][j+1];
24 }
25 }
26
27 int main()
28 {
29 // freopen("in.txt","r",stdin);
30 int t;
31 cin>>t;
32 while(t--)
33 {
34 cin>>s1>>s2;
35 dp();
36 cout<<a[s1.length()][s2.length()]<<endl;
37 }
38 return 0;
39 }
2 状态转移方程:
3 s1[i] == s2[j] 时,same[i,j] = 1;
4 ans = max(a[i][j]+same[i,j], a[i][j-1], a[i-1][j])
5
6 *****************************************************/
7 #include<iostream>
8 #include<cstring>
9 #include<string>
10 using namespace std;
11 #define N 1005
12 int a[N][N];
13 string s1,s2;
14
15 void dp()
16 {
17 int i,j;
18 memset(a,0,sizeof(a));
19 for(i = 0; i < s1.length(); i++)
20 for(j = 0; j < s2.length(); j++)
21 {
22 if(s1[i] == s2[j]) a[i+1][j+1] = a[i][j] + 1;
23 else a[i+1][j+1] = a[i+1][j]>a[i][j+1]?a[i+1][j]:a[i][j+1];
24 }
25 }
26
27 int main()
28 {
29 // freopen("in.txt","r",stdin);
30 int t;
31 cin>>t;
32 while(t--)
33 {
34 cin>>s1>>s2;
35 dp();
36 cout<<a[s1.length()][s2.length()]<<endl;
37 }
38 return 0;
39 }