Codeforces 463D Gargari and Permutations:隐式图dp【多串LCS】
题目链接: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();
}
Codeforces 463D Gargari and Permutations:隐式图dp【多串LCS】的更多相关文章
- Codeforces 463D Gargari and Permutations(求k个序列的LCS)
题目链接:http://codeforces.com/problemset/problem/463/D 题目大意:给你k个序列(2=<k<=5),每个序列的长度为n(1<=n< ...
- Codeforces 463D Gargari and Permutations
http://codeforces.com/problemset/problem/463/D 题意:给出k个排列,问这k个排列的最长公共子序列的长度. 思路:只考虑其中一个的dp:f[i]=max(f ...
- codeforces 463D Gargari and Permutations(dp)
题目 参考网上的代码的... //要找到所有序列中的最长的公共子序列, //定义状态dp[i]为在第一个序列中前i个数字中的最长公共子序列的长度, //状态转移方程为dp[i]=max(dp[i],d ...
- 【UVA】658 - It's not a Bug, it's a Feature!(隐式图 + 位运算)
这题直接隐式图 + 位运算暴力搜出来的,2.5s险过,不是正法,做完这题做的最大收获就是学会了一些位运算的处理方式. 1.将s中二进制第k位变成0的处理方式: s = s & (~(1 < ...
- 八数码问题+路径寻找问题+bfs(隐式图的判重操作)
Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...
- uva658(最短路径+隐式图+状态压缩)
题目连接(vj):https://vjudge.net/problem/UVA-658 题意:补丁在修正 bug 时,有时也会引入新的 bug.假定有 n(n≤20)个潜在 bug 和 m(m≤100 ...
- nyoj 21--三个水杯(隐式图bfs)
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识 ...
- UVA 658 状态压缩+隐式图+优先队列dijstla
不可多得的好题目啊,我看了别人题解才做出来的,这种题目一看就会做的实在是大神啊,而且我看别人博客都看了好久才明白...还是对状态压缩不是很熟练,理解几个位运算用了好久时间.有些题目自己看着别人的题解做 ...
- UVA - 658 It's not a Bug, it's a Feature! (隐式图的最短路,位运算)
隐式的图搜索,存不下边,所以只有枚举转移就行了,因为bug的存在状态可以用二进制表示,转移的时候判断合法可以用位运算优化, 二进制pre[i][0]表示可以出现的bug,那么u&pre[i][ ...
随机推荐
- oracle查询当前会话数量
SELECT a.inst_id,sid,username,event,sql_id,a.PROGRAM FROM gv$session a WHERE a.STATUS='ACTIVE' AND u ...
- Hadoop2.6.0版本MapReudce示例之WordCount(一)
一.准备测试数据 1.在本地Linux系统/var/lib/Hadoop-hdfs/file/路径下准备两个文件file1.txt和file2.txt,文件列表及各自内容如下图所示: 2.在hdfs中 ...
- x264源代码学习1:概述与架构分析
函数背景色 函数在图中以方框的形式表现出来.不同的背景色标志了该函数不同的作用: 白色背景的函数:不加区分的普通内部函数. 浅红背景的函数:libx264类库的接口函数(API). 粉红色背景函数:滤 ...
- hibernate 注解之 SequenceGenerator
hibernate 注解之 SequenceGenerator https://blog.csdn.net/zgf19930504/article/details/54694807 JPA @Id 和 ...
- Android注解支持(Support Annotations) (转)
原文地址:http://www.flysnow.org/2015/08/13/android-tech-docs-support-annotations.html 注解支持(Support Annot ...
- ios 即时通讯 xmpp
[iPhone高级] 基于XMPP的IOS聊天客户端程序(XMPP服务器架构) http://blog.csdn.NET/kangx6/article/details/7739828 [iPhone高 ...
- poj1845(二分快速求等比数列模M和)
Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 17039 Accepted: 4280 Descripti ...
- Amr and Chemistry
C. Amr and Chemistry time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 查看Android.mk文件中的变量的值
当某个Android.mk中包含如下: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_C_INCLUDES += \ $(LOCAL ...
- 怎样过滤跨站恶意脚本攻击(XSS)
什么是XSS? XSS(Cross Site Scripting),即跨站脚本攻击,是一种常见于web application中的计算机安全漏洞.XSS通过在用户端注入恶意的可运行脚本,若服务器端对用 ...