Codeforces 463D Gargari and Permutations:隐式图dp【多串LCS】
2024-09-05 20:20:18
题目链接: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();
}
最新文章
- Worktile协同特色之一:无处不在的关注
- Javascript 中 == 和 === 区别
- 【转】Web前端研发工程师编程能力飞升之路
- spring+struts2的jar
- OC--第一个程序
- 疯狂java讲义——初始化块
- UVa 11722 (概率 数形结合) Joining with Friend
- (转)使用 .NET 的 RNGCryptoServiceProvider 生成随机数
- [Android] FileInputStream跟踪
- 读书笔记 effective c++ Item 17 使用单独语句将new出来的对象放入智能指针
- [转载] Solr使用入门指南
- nginx 浏览php的时候会变成下载
- python作业01
- jQuery 练习:取出数组字典的值, 静态对话框, clone方法应用
- Linux环境安装PostgreSQL-10.1
- Linux下gcc编译控制动态库导出函数小结
- Java集合之Hashtable源码分析
- Python全栈学习_day006作业
- python之tkinter使用-单级菜单
- Mysql 性能优化5【重要】数据库结构优化
热门文章
- 解决 三星Note3 桌面小部件不实时更新/不刷新 的问题
- VSCode调试.net core 2.0 输出窗口乱码
- Gmail收不到邮件咋办?
- EXTjs+SpringMVC+Mybatis实现照片的上传,下载,查看关键技术整理
- linux下的Java开发 intellij idea+tomcat+maven
- Gradle 构建工具
- 图像处理之基础---2个YUV视频 拼接技术
- KeyboardJS 开发指南 - 与 Three.js 配合使用的捕捉键盘组合键库
- TP框架的修改,删除
- vue组件父子组件之间传递数据