题目链接: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】的更多相关文章

  1. Codeforces 463D Gargari and Permutations(求k个序列的LCS)

    题目链接:http://codeforces.com/problemset/problem/463/D 题目大意:给你k个序列(2=<k<=5),每个序列的长度为n(1<=n< ...

  2. Codeforces 463D Gargari and Permutations

    http://codeforces.com/problemset/problem/463/D 题意:给出k个排列,问这k个排列的最长公共子序列的长度. 思路:只考虑其中一个的dp:f[i]=max(f ...

  3. codeforces 463D Gargari and Permutations(dp)

    题目 参考网上的代码的... //要找到所有序列中的最长的公共子序列, //定义状态dp[i]为在第一个序列中前i个数字中的最长公共子序列的长度, //状态转移方程为dp[i]=max(dp[i],d ...

  4. 【UVA】658 - It&#39;s not a Bug, it&#39;s a Feature!(隐式图 + 位运算)

    这题直接隐式图 + 位运算暴力搜出来的,2.5s险过,不是正法,做完这题做的最大收获就是学会了一些位运算的处理方式. 1.将s中二进制第k位变成0的处理方式: s = s & (~(1 < ...

  5. 八数码问题+路径寻找问题+bfs(隐式图的判重操作)

    Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...

  6. uva658(最短路径+隐式图+状态压缩)

    题目连接(vj):https://vjudge.net/problem/UVA-658 题意:补丁在修正 bug 时,有时也会引入新的 bug.假定有 n(n≤20)个潜在 bug 和 m(m≤100 ...

  7. nyoj 21--三个水杯(隐式图bfs)

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识 ...

  8. UVA 658 状态压缩+隐式图+优先队列dijstla

    不可多得的好题目啊,我看了别人题解才做出来的,这种题目一看就会做的实在是大神啊,而且我看别人博客都看了好久才明白...还是对状态压缩不是很熟练,理解几个位运算用了好久时间.有些题目自己看着别人的题解做 ...

  9. UVA - 658 It's not a Bug, it's a Feature! (隐式图的最短路,位运算)

    隐式的图搜索,存不下边,所以只有枚举转移就行了,因为bug的存在状态可以用二进制表示,转移的时候判断合法可以用位运算优化, 二进制pre[i][0]表示可以出现的bug,那么u&pre[i][ ...

随机推荐

  1. 快速搭建一个成熟,强壮的App框架【转载】

    App框架搭建 招聘信息: iOS 研发工程师 iOS开发工程师 iOS开发实习工程师 新浪微博-Android开发工程师&iOS开发工程师 美术设计师(2D) UI设计师 cocos2dx手 ...

  2. 华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大!

    华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大! 在华为最新发布的nova 3手机上,抖音通过华为himedia SDK集成了60fps.超级慢动作等华为媒体开放能力,在加持这些能力后,抖音 ...

  3. Wormholes - poj 3259 (Bellman-Ford算法)

      Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 34934   Accepted: 12752 Description W ...

  4. IntelliJ idea——》创建tag、删除tag

    https://blog.csdn.net/weixin_43453386/article/details/83857038

  5. GDB + gdbserver 远程调试mediaserver进程

    远程调试步骤 在Android设备上启动gdbserver并attach你想调试的进程,并指定监听调试命令的端口(此端口是TV上的端口) $ adb shell # ps |grep media  # ...

  6. COM线程模型 套间概念

    COM线程模型 套间概念 1) 单线程套间.线程是COM主线程,初始化COM库的进程的第一个线程.即使从其他线程访问COM组件,也不需要手工同步,COM库已经实现了同步.寓所线程里有个消息处理循环来处 ...

  7. web 开发之js---js 实现自动添加input text 编辑框

    <html><head><script type="text/javascript">function addNewLine(){var for ...

  8. Excel中批量把数字类型转换为文本类型

    客户给的excel文件中的内容全部是数值类型,这些我们要当成文本存入到数据库,所以需要把所有的数值转换为文本,但是直接通过修改单元格属性来修改的话会变成科学技数法,还有一种方法是在数值得前面加个英文的 ...

  9. echart 图表自定义样式

    initChart: function (id) { this.charts = echarts.init(document.getElementById(id)) this.charts.setOp ...

  10. 九度OJ 1206:字符串连接 (字符串操作)

    时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:4127 解决:1957 题目描述: 不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来. 输入: 每一行包括两个 ...