zoj 1425 Crossed Matchings

来源:互联网 发布:家用饮水机推荐 知乎 编辑:程序博客网 时间:2024/04/30 07:20

d[i][j]:=第一行的前i个与第二行的前j个匹配的最大值

d[i][j]:=max(d[i-1][j],d[i][j-1],d[s1-1][s2-1]+2)

1<=s1<i,1<=s2<j

a[s1]==b[j],a[i]==b[s2],a[i]!=b[j]

#include <bits/stdc++.h>using namespace std;int main(){int m;scanf("%d",&m);while(m--){int n1,n2;scanf("%d%d",&n1,&n2);int a[105],b[105];for (int i=1;i<=n1;i++) scanf("%d",&a[i]);for (int i=1;i<=n2;i++) scanf("%d",&b[i]);int d[105][105];memset(d,0,sizeof(d));for (int i=2;i<=n1;i++){for (int j=2;j<=n2;j++){for (int s1=1;s1<i;s1++){for (int s2=1;s2<j;s2++){if (a[s1]==b[j]&&a[i]==b[s2]&&a[i]!=b[j]){d[i][j]=max(d[i][j],d[s1-1][s2-1]+2);}}}d[i][j]=max(d[i][j],max(d[i][j-1],d[i-1][j]));}}printf("%d\n",d[n1][n2]);}return 0;}


0 0
原创粉丝点击