您的位置:首页 > 其它

Codeforces 264 (Div. 2) D. Gargari and Permutations

2017-07-29 19:31 501 查看
题意:给定k个1~n的排列,求出k个序列的LCS长度。

思路:如果k列中,每个i都在j前面,那就在i到j之间连一条有向边。这样问题转换为求最长DAG。

还可以这样建图。。

记录每个点在序列中的位置。然后每两个数都要判断一下。在k个序列中,I都在j的前面,那么建立一条有向边。

#include<cstdio>//思路:如果k列中,每个i都在j前面,那就在i到j之间连一条有向边。这样问题转换为求最长DAG
#include<queue>
#include<iostream>
#include<vector>
#include<map>
#include<cstring>
#include<string>
#include<set>
#include<stack>
#include<algorithm>
#define cle(a) memset(a,0,sizeof(a))
#define inf(a) memset(a,ox3f,sizeof(a))
#define ll long long
#define Rep(i,a,n) for(int i=a;i<=n;i++)
using namespace std;
const int INF = ( 2e9 ) + 2;
cons
4000
t int maxn = 1e3+10;
int a[10][maxn];
vector<int> g[maxn];
int vis[maxn];
int n,k;
bool check(int x,int y)
{
for(int i=0;i<k;i++)
{
if(a[i][x]>=a[i][y])
return false;
}
return true;
}
int dfs(int u)
{
if(vis[u])
return vis[u];
int ans=0;
for(int i=0,L=g[u].size();i<L;i++)
{
int v=g[u][i];
ans=max(dfs(v),ans);
}
return vis[u]=ans+1;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<k;i++)
for(int j=0;j<n;j++)
{
int buf;
scanf("%d",&buf);
a[i][buf]=j;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(check(i,j))
g[i].push_back(j);
int ans=-1;
for(int i=1;i<=n;i++)
{
ans=max(ans,dfs(i));
}
printf("%d\n",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: