题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5495
题意:给我们两个序列a和b,这两个序列的元素都是1~n,问我们能否给出一个排列方式,使得a和b经过这个排列方式的变化后的最长公共子序列最长。
a和b的排列方式都是根据一个排列方式变化的,所以很明显每一位的a的值和b的值是绑定了的,也就是排列方式一定是一起移动的,那么我们完全可以直接搜索就能得到一个最终的答案。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100000+5;
int vis[maxn];
struct Node
{
int a,b;
}p[maxn];
int cmp(Node a,Node b)
{
return a.a < b.a;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++) scanf("%d",&p[i].a);
for(int i=1; i<=n; i++) scanf("%d",&p[i].b);
memset(vis,0,sizeof(vis));
sort(p+1,p+n+1,cmp);
int ans = 0;
for(int i=1; i<=n; i++)
{
if(vis[i]) continue;
vis[i] = 1;
if(p[i].a == p[i].b) ans++;
else
{
int pos = p[i].b;
while(!vis[pos])
{
ans++;
vis[pos] = 1;
pos = p[pos].b;
}
}
}
printf("%d\n",ans);
}
return 0;
}