CF463D Gargari and Permutations dp
给定 $n<=10$ 个 $1$~$n$ 的排列,求这些排列的 $LCS$.
考虑两个排列怎么做:以第一个序列为基准,将第二个序列的元素按照该元素在第一个序列中出现位置重新编号.
然后,求一个 $LIS$ 即可.
现在是多个串,不妨也按照这个方法来做:
以第一个串为基准,其余串重新编号成该元素在第一个串中的出现位置.
那么,如果一个序列是 $n$ 个序列的 $LCS$,则满足两个条件:
1: 是重现编号后的 $LCS$
2: 这个 $LCS$ 还需是一个 $LIS$.
多了第二个限制,问题就简单了:令 $f[i]$ 表示这些新编号串以 $i$ 数字结尾的满足两个条件的最长长度.
转移什么的就简单了~
code:
#include <bits/stdc++.h>
#define N 1004
using namespace std;
void setIO(string s)
{
string in=s+".in";
string out=s+".out";
freopen(in.c_str(),"r",stdin);
freopen(out.c_str(),"w",stdout);
}
struct node
{
int l,r;
}t[N];
int a[12][N],pos[N],f[N],L[12][N];
int main()
{
// setIO("seq");
int n,i,j,m,ans=1;
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i) for(j=1;j<=n;++j) scanf("%d",&a[i][j]);
for(i=1;i<=n;++i) pos[a[1][i]]=i;
for(i=1;i<=m;++i) for(j=1;j<=n;++j) a[i][j]=pos[a[i][j]];
for(i=1;i<=m;++i) for(j=1;j<=n;++j) L[i][a[i][j]]=j;
f[1]=1;
for(i=2;i<=n;++i)
{
f[i]=1;
for(j=1;j<i;++j)
{
int flag=0;
for(int k=1;k<=10;++k) if(L[k][j]>L[k][i]) flag=1;
if(!flag) f[i]=max(f[i], f[j]+1), ans=max(ans, f[i]);
}
}
printf("%d\n",ans);
return 0;
}
CF463D Gargari and Permutations dp的更多相关文章
- codeforces 463D Gargari and Permutations(dp)
题目 参考网上的代码的... //要找到所有序列中的最长的公共子序列, //定义状态dp[i]为在第一个序列中前i个数字中的最长公共子序列的长度, //状态转移方程为dp[i]=max(dp[i],d ...
- CF 463D Gargari and Permutations [dp]
给出一个长为n的数列的k个排列(1 ≤ n ≤ 1000; 2 ≤ k ≤ 5).求这个k个数列的最长公共子序列的长度 dp[i]=max{dp[j]+1,where j<i 且j,i相应的字符 ...
- [CF463D]Gargari and Permutations
题目大意:给你$k(2\leqslant k\leqslant5)$个$1\sim n(n\leqslant10^3)$的排列,求它们的最长子序列 题解:将$k$个排列中每个元素的位置记录下来.如果是 ...
- 【题解】POJ2279 Mr.Young′s Picture Permutations dp
[题解]POJ2279 Mr.Young′s Picture Permutations dp 钦定从小往大放,然后直接dp. \(dp(t1,t2,t3,t4,t5)\)代表每一行多少人,判断边界就能 ...
- Codeforces Round #264 (Div. 2) D. Gargari and Permutations 多序列LIS+dp好题
http://codeforces.com/contest/463/problem/D 求k个序列的最长公共子序列. k<=5 肯定 不能直接LCS 网上题解全是图论解法...我就来个dp的解法 ...
- Codeforces 463D Gargari and Permutations:隐式图dp【多串LCS】
题目链接:http://codeforces.com/problemset/problem/463/D 题意: 给你k个1到n的排列,问你它们的LCS(最长公共子序列)是多长. 题解: 因为都是1到n ...
- Codeforces #264 (Div. 2) D. Gargari and Permutations
Gargari got bored to play with the bishops and now, after solving the problem about them, he is tryi ...
- CodeForces - 285E: Positions in Permutations(DP+组合数+容斥)
Permutation p is an ordered set of integers p1, p2, ..., pn, consisting of n distinct positive in ...
- Codeforces 463D Gargari and Permutations
http://codeforces.com/problemset/problem/463/D 题意:给出k个排列,问这k个排列的最长公共子序列的长度. 思路:只考虑其中一个的dp:f[i]=max(f ...
随机推荐
- Spring Cloud--实现Eureka的高可用(Eureka集群搭建)实例
将10086注册到10087上: 再在10086服务的基础上复制一个Eureka的服务,端口为10087,将其注册到10086上: application-name的名称保持一致,只是一个服务的两个实 ...
- 3.03定义常量之enum
[注:本程序验证是使用vs2013版] #include <stdio.h> #include <stdlib.h> #include <string.h> #pr ...
- bootstrap Modal或者 bootbox弹窗时,页面混动至顶部
bootstrap使用Modal时,页面自动滚动至了最顶部, 调用bootbox时,也是如此 查了半天资料,最后参考下述帖子,解决问题 https://stackoverflow.com/questi ...
- 2.Vue 获取企业微信的Code并把Code发送的后台进行验证
1 . 在企业微信配置请求的页面写入下面代码 mounted() { //获取微信请求的的Code let code = this.$route.query.code; if (code) { thi ...
- PowerShell命令批量添加、导出AD用户
导入单个AD用户命令 New-ADUser -Name "周八" -Surname "周" -GivenName "八"-SamAccoun ...
- 查询本地ip以及ip地址库查询
四种方法查询本地ip from urllib2 import urlopen from json import load my_ip = urlopen('http://ip.42.pl/raw'). ...
- React 中的 定义组件的 两种方式
React 中创建 Components 的方式有两种:Function and Class 定义一个组件最简单的方法就是写一个 JavaScript 函数 function Welcome(prop ...
- Android Jetpack组件
带你领略Android Jetpack组件的魅力 Android新框架jetpack的内容讲解:Room.WorkManager.LifeCycles.LiveData.ViewModel.DataB ...
- mysql如何让有数据的表的自增主键重新设置从1开始连续自增
项目开发中,有些固定数据在数据表中,主键是从1自增的,有时候我们会删除一些数据, 这种情况下,主键就会不连续.如何恢复到像第一次插入数据一样主键从1开始连续增长, 这里我找到一种解决方法: 如上面一张 ...
- DevOps简介_转
转自:DevOps简介 刘大飞 DevOps 是一个完整的面向IT运维的工作流,以 IT 自动化以及持续集成(CI).持续部署(CD)为基础,来优化程式开发.测试.系统运维等所有环节. Dev ...