题目链接:http://codeforces.com/problemset/problem/463/D

题意:

  给你k个1到n的排列,问你它们的LCS(最长公共子序列)是多长。

题解:

  因为都是1到n的排列,即每个串中,1到n每个数字恰好出现一次。

  将相同的数字之间相连,可以得到下面的样子(n = 4, k = 3):

  

  显然,要求的LCS就等于图中互不相交的最多连线个数。

  将每一个数字看做一个节点。

  若i到j有一条有向边,则代表:

    数字j的连线在i的连线的后面,且互不相交。

  即:

    若i->j,则要满足所有的pos[k][i] <= pos[k][j]。

    其中pos[k][i]表示第k个串中,数字i出现的位置。

  O(N^2*K)建图,最终得到的一定是一个有向无环图。

  LCS就等于这个图上的最长路径长度。

  所以dfs跑一边dp就行了。

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAX_N 1005
#define MAX_K 10 using namespace std; int n,k;
int dp[MAX_N];
int a[MAX_K][MAX_N];
int pos[MAX_K][MAX_N];
vector<int> edge[MAX_N]; void read()
{
cin>>n>>k;
for(int i=;i<=k;i++)
{
for(int j=;j<=n;j++)
{
cin>>a[i][j];
pos[i][a[i][j]]=j;
}
}
} bool is_valid(int x,int y)
{
for(int i=;i<=k;i++)
{
if(pos[i][x]>=pos[i][y]) return false;
}
return true;
} void build()
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(is_valid(i,j)) edge[i].push_back(j);
}
}
} void dfs(int now)
{
dp[now]=;
for(int i=;i<edge[now].size();i++)
{
int temp=edge[now][i];
if(dp[temp]==-) dfs(temp);
dp[now]=max(dp[now],dp[temp]+);
}
} void work()
{
build();
memset(dp,-,sizeof(dp));
int ans=;
for(int i=;i<=n;i++)
{
if(dp[i]==-) dfs(i);
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
} int main()
{
read();
work();
}

最新文章

  1. Worktile协同特色之一:无处不在的关注
  2. Javascript 中 == 和 === 区别
  3. 【转】Web前端研发工程师编程能力飞升之路
  4. spring+struts2的jar
  5. OC--第一个程序
  6. 疯狂java讲义——初始化块
  7. UVa 11722 (概率 数形结合) Joining with Friend
  8. (转)使用 .NET 的 RNGCryptoServiceProvider 生成随机数
  9. [Android] FileInputStream跟踪
  10. 读书笔记 effective c++ Item 17 使用单独语句将new出来的对象放入智能指针
  11. [转载] Solr使用入门指南
  12. nginx 浏览php的时候会变成下载
  13. python作业01
  14. jQuery 练习:取出数组字典的值, 静态对话框, clone方法应用
  15. Linux环境安装PostgreSQL-10.1
  16. Linux下gcc编译控制动态库导出函数小结
  17. Java集合之Hashtable源码分析
  18. Python全栈学习_day006作业
  19. python之tkinter使用-单级菜单
  20. Mysql 性能优化5【重要】数据库结构优化

热门文章

  1. 解决 三星Note3 桌面小部件不实时更新/不刷新 的问题
  2. VSCode调试.net core 2.0 输出窗口乱码
  3. Gmail收不到邮件咋办?
  4. EXTjs+SpringMVC+Mybatis实现照片的上传,下载,查看关键技术整理
  5. linux下的Java开发 intellij idea+tomcat+maven
  6. Gradle 构建工具
  7. 图像处理之基础---2个YUV视频 拼接技术
  8. KeyboardJS 开发指南 - 与 Three.js 配合使用的捕捉键盘组合键库
  9. TP框架的修改,删除
  10. vue组件父子组件之间传递数据