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