POJ1692 Crossed Matchings DP

来源:互联网 发布:电子导游软件 编辑:程序博客网 时间:2024/04/19 23:55

POJ1692 Crossed Matchings DP

Description

给出两列数,要求对上下相同的数进行连线,要求
1.一个数最多连一条线。
2.一条线必须且仅与一条线相交。
求最多可以连出几条线。

题解

这一题可以用LIS的思想来建立状态转移方程。
令f[i][j]表示第一行到i个数,第二行到j个数的答案。

f[i][j]=max(f[i][j1],f[i1][j])

如果能找到x[1,i)y[1,j) 满足 a[x]=b[j]b[y]=a[j](就是上下匹配)
那么
f[i][j]=max(f[i][j1],f[i1][j],f[i1][j1]+2)

#include <cstdio>#include <cmath>#include <algorithm>#include <cstring>#define MAXN 100+10using namespace std;int f[MAXN][MAXN],a[MAXN],b[MAXN],t,n,m;int main(){    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        memset(f,0,sizeof(f));        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        for(int i=1;i<=n;i++) scanf("%d",&a[i]);        for(int i=1;i<=m;i++) scanf("%d",&b[i]);        for(int i=1;i<=n;i++)        {            for(int j=1;j<=m;j++)            {                int x,y;                f[i][j]=max(f[i-1][j],f[i][j-1]);                if(a[i]==b[j]) continue ;                for(x=i-1;x>0;x--)  if(a[x]==b[j]) break;                for(y=j-1;y>0;y--)  if(b[y]==a[i]) break;                if(!x||!y) continue ;                f[i][j]=max(f[i][j],f[x-1][y-1]+2);            }        }        printf("%d\n",f[n][m]);    }    return 0;}
0 0
原创粉丝点击