hdu 5495 LCS

来源:互联网 发布:c语言中double 编辑:程序博客网 时间:2024/06/05 14:28

很有意思的一题  怎么也想不到思路  考虑dp,搜索都做不了;

看了题解;

有一种很巧妙的方法:

例如两列数据分别是     

1 3 2 4

3 2 4 1


那么1->3->2->4->1  正好构成一个循环;

可以把环里的其中一个数给拆开,那么LCS最大肯定能到n-1;

假如环的长度只有1,那么肯定能构造出来长度为1的LCS;

所以答案就是 所有长度大于1的环的长度-1相加,并加上所有长度为1的环;

可以建边之后用搜索来做,也可以用并查集来做;

也可以保存好原来数的位置,简单寻找一下就行;


代码:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int a[100005],b[100005];int c[100005];int vis[100005];int main(){    int T;    scanf("%d",&T);    while(T--)    {        memset(vis,0,sizeof(vis));        int n;        scanf("%d",&n);        int i,j;        for(i=1;i<=n;i++)        {            scanf("%d",&a[i]);            c[a[i]]=i;        }        for(i=1;i<=n;i++)            scanf("%d",&b[i]);        int ans=0;        for(i=1;i<=n;i++)        {             if(!vis[a[i]])             {                 int now=b[i];                 int x=a[i];                 ans++;                 int t=0;                 while(now!=x)                 {                     vis[a[c[now]]]=1;                     now=b[c[now]];                     t++;                     if(t>1)                     ans++;                 }             }        }        printf("%d\n",ans);    }    return 0;}




0 0
原创粉丝点击