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][ ...
随机推荐
- unity开发android游戏(一)搭建Unity安卓开发环境
unity开发android游戏(一)搭建Unity安卓开发环境 分类: Unity2014-03-23 16:14 5626人阅读 评论(2) 收藏 举报 unity开发androidunity安卓 ...
- 快速搭建一个成熟,强壮的App框架【转载】
App框架搭建 招聘信息: iOS 研发工程师 iOS开发工程师 iOS开发实习工程师 新浪微博-Android开发工程师&iOS开发工程师 美术设计师(2D) UI设计师 cocos2dx手 ...
- Mybatis-There is no getter for property named 'id' in 'class java.lang.String'
<mapper namespace="cn.telchina.standard.mapper.SysOrgnMapper"> <!-- <![CDATA[s ...
- ffmpeg截图
ffmpeg.exe -probesize 32768 -i "rtmp://localhost/live/1 live=1" -y -t 0.001 -ss 1 -f image ...
- 使用MongoDB 记录业务日志
最近公司有个需求,要对业务日志进行记录并根据日志排查问题,以前都是使用log4net之类的日志组件来记录到文件,这种方式已经不能满足业务的需要,因为日志文件会很大,即使进行分割后,查找也是很不方便,何 ...
- 【安装.net framework4.0】之安装失败,“安装时发生严重错误”
在网上查了很多资料都说改什么文件名和注册表什么的,根本没用,后来查到一篇文章,提供了下面的解决办法: 地址:<Microsoft .NET Framework 4.0安装时发生严重错误 无法安装 ...
- Java中synchronized用在静态方法和非静态方法上面的区别
synchronized 修饰在 static方法和非static方法的区别 在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法.也可以sync ...
- unity 切换场景
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; ...
- c# 当前不会命中断点 未载入该文档
C#编码时.有时会遇到标题所说的问题,就是说这个文件和方法明明存在,可总是提示找不到方法.解决方法例如以下: 1.清理全部项目(或相关项目)生成 2.又一次加入全部项目(或相关项目)间的互相引用 3. ...
- 自己定义Application的未捕获异常处理
近期由于工作原因.进行Android应用开发时发现应用在出现类似空指针等异常时,抛出未被捕获的异常.Android系统有默认的未捕获异常处理器,默认行为是结束对应的线程,但并不会直接退出程序,并且在应 ...