【题解】:
【代码】:
1 #include <iostream>
2 #include <string.h>
3 #include <stdio.h>
4 using namespace std;
5
6 int dp[105][105];
7 int N1,N2;
8 int a[105],b[105];
9 int main(){
10 int M;
11 scanf("%d",&M);
12 while(M--){
13 scanf("%d%d",&N1,&N2);
14 for(int i=1;i<=N1;i++) scanf("%d",&a[i]);
15 for(int i=1;i<=N2;i++) scanf("%d",&b[i]);
16
17 memset(dp,0,sizeof(dp));
18 for(int i=1;i<=N1;i++){
19 for(int j=1;j<=N2;j++){
20 if (a[i]==b[j]) dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
21 if (a[i]!=b[j]) {
22 int mati=-1,matj=-1;
23 for(int p=j-1;p>=1;p--){//在第二行搜索可能匹配的位置
24 if (b[p]==a[i]) {
25 mati=p;break;
26 }
27 }
28 for(int p=i-1;p>=1;p--){//在第一行搜索匹配b的位置
29 if (a[p]==b[j]){
30 matj=p;break;
31 }
32 }
33 dp[i][j]=max(dp[i][j],dp[i-1][j]);
34 dp[i][j]=max(dp[i][j],dp[i][j-1]);
35 if(mati>0 && matj>0) dp[i][j]=max(dp[i][j],dp[matj-1][mati-1]+2);
36 }
37 }
38 }
39
40 cout<<dp[N1][N2]<<endl;
41 }
42 return 0;
43 }
时间: 2024-10-25 14:40:51