首页 > 代码库 > zoj1425 Crossed Matchings
zoj1425 Crossed Matchings
【题解】:
【代码】:
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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。