这题说的是给了k个串算出这k个串的最长公共子序列,这k个串每个串都是由1--n的数字组成的。

将第一串的数字按照顺序重新编号为123...n 然后后面的串按照这个编号重新标号,就转化为下面每个串大最长递增子序列的问题,然后我们对于每个串计算出后面比他大的数然后建一条边(用邻接矩阵存)然后可以判断出从a到b点是否有k-1条这样我们专门挑那些k-1条的走这样保证每个序列中都有这样最后dfs算出最长的那个

#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
const int MAX_N = ;
int renum[MAX_N];
int edg[MAX_N][MAX_N],dp[MAX_N];
int rt[][MAX_N],ans,R,n;
bool use[MAX_N];
void dfs(int loc, int len){
ans=max(len,ans);
dp[loc]=len;
for(int i=loc+; i<=n; ++i)
if(edg[loc][i]==R&&dp[i]<len+){
dfs(i,len+);
}
}
int main()
{
int k;
while(scanf("%d%d",&n,&k)==){
for(int i =; i<=n; ++i){
scanf("%d",&rt[][i]);
renum[rt[][i]]=i;
}
R=k-;
for(int i=; i<k; ++i){
rt[i][]=;
for(int j=; j<=n; ++j){
scanf("%d",&rt[i][j]);
rt[i][j]=renum[rt[i][j]];
}
}
memset(edg,,sizeof(edg));
for(int i=; i<k; i++){
for(int j =; j<=n; ++j){
for(int t=j+; t<=n; ++t)
if(rt[i][j]<rt[i][t]) edg[rt[i][j]][rt[i][t]]++;
}
}
ans=;
memset(dp,,sizeof(dp));
dfs(,);
printf("%d\n",ans);
}
return ;
}

最新文章

  1. ASP.NET MVC 系列随笔汇总[未完待续……]
  2. Linux查看操作系统时间
  3. LFS初次成功+如何粘贴复制LFS命令
  4. SQL VIEW 使用语法
  5. MongoDB 2: 安装和使用
  6. NYOJ-253 凸包
  7. ZOJ 1074 最大子矩阵和
  8. LeetCode_Populating Next Right Pointers in Each Node
  9. ssh: scp命令
  10. [nodejs] day1-创建服务器
  11. 网站开发进阶(四十四)input type=&quot;submit&quot; 和&quot;button&quot;的区别
  12. linux中sogou输入法崩溃重启
  13. 一次php访问sql server 2008的API接口的采坑
  14. js生成带有logo的二维码并保存成图片下载
  15. 匆忙记录 编译linux kernel zImage
  16. 034 Maven中的dependencyManagement和dependencies区别
  17. python逻辑回归 自动建模
  18. python, 在信用评级中,计算KS statistic值
  19. 腾讯优图联手Science发布主题报告:计算机视觉的研发和应用
  20. Python网络编程(Sockets)

热门文章

  1. Docker 容器管理:rancher
  2. 一、laya学习笔记 --- layabox环境搭建 HelloWorld(坑:ts版本问题解决方案)
  3. Unity3D笔记 GUI 四、实现选项卡三
  4. Xcode - Xcodeproject详解
  5. [转][darkbaby]任天堂传——失落的泰坦王朝(中)
  6. mysql 小于等于0 不包含null
  7. HOJ 2133&POJ 2964 Tourist(动态规划)
  8. 指定多个pip源
  9. ZB api
  10. C++三大特性之多态