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 trying to do math homework. In a math book he have foundk permutations. Each of them consists of numbers1, 2, ..., n
in some order. Now he should find the length of the longest common subsequence of these permutations. Can you help Gargari?
You can read about longest common subsequence there:
https://en.wikipedia.org/wiki/Longest_common_subsequence_problem
The first line contains two integers n andk
(1 ≤ n ≤ 1000; 2 ≤ k ≤ 5). Each of the nextk lines contains integers
1, 2, ..., n in some order — description of the current permutation.
Print the length of the longest common subsequence.
4 3
1 4 2 3
4 1 2 3
1 2 4 3
3
The answer for the first test sample is subsequence [1, 2, 3].
题意:求k个长度为n的最长公共子序列
思路1:保存每一个数在各自串的位置,由于结果是第1个串中的某个可能,所以我们枚举第1个串的可能,然后检查假设一个以a[j]为结束的最长公共子序列成立的情况是,对于每一个串的a[i]都在a[j]的前面,那么就有dp[j] = max(dp[j], dp[i]+1)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1010; int n, k;
int a[maxn][maxn], b[maxn][maxn], dp[maxn]; int check(int x, int y) {
for (int i = 2; i <= k; i++)
if (b[i][x] > b[i][y])
return 0;
return 1;
} int main() {
scanf("%d%d", &n, &k);
for (int i = 1; i <= k; i++)
for (int j = 1; j <= n; j++) {
scanf("%d", &a[i][j]);
b[i][a[i][j]] = j;
} for (int i = 1; i <= n; i++)
dp[i] = 1; int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = i+1; j <= n; j++) {
if (check(a[1][i], a[1][j]))
dp[j] = max(dp[i]+1, dp[j]);
}
} for (int i = 1; i <= n; i++)
ans = max(ans, dp[i]);
printf("%d\n", ans);
return 0;
}
思路2:假设一个数字i在每一个串的位置都在j前面,那么i到j就有一条有向边,那么题目就转换为DAG求最长
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 1010; int num[10][maxn], vis[maxn];
int n, k;
vector<int> g[maxn]; int check(int x, int y) {
for (int i = 0; i < k; i++)
if (num[i][x] >= num[i][y])
return 0;
return 1;
} int dfs(int x) {
int ans = 0;
if (vis[x])
return vis[x]; int size = g[x].size();
for (int i = 0; i < size; i++)
ans = max(ans, dfs(g[x][i])); return vis[x] = ans + 1;
} int main() {
scanf("%d%d", &n, &k);
memset(vis, 0, sizeof(vis));
for (int i = 0; i <= n; i++)
g[i].clear(); int a;
for (int i = 0; i < k; i++)
for (int j = 1; j <= n; j++) {
scanf("%d", &a);
num[i][a] = j;
} for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (check(i, j))
g[i].push_back(j); int ans = 0;
for (int i = 1; i <= n; i++)
if (!vis[i])
ans = max(ans, dfs(i)); printf("%d\n", ans);
return 0;
}
Codeforces #264 (Div. 2) D. Gargari and Permutations的更多相关文章
- Codeforces Round #264 (Div. 2) D. Gargari and Permutations 多序列LIS+dp好题
http://codeforces.com/contest/463/problem/D 求k个序列的最长公共子序列. k<=5 肯定 不能直接LCS 网上题解全是图论解法...我就来个dp的解法 ...
- Codeforces Round #264 (Div. 2) C. Gargari and Bishops 主教攻击
http://codeforces.com/contest/463/problem/C 在一个n∗n的国际象棋的棋盘上放两个主教,要求不能有位置同时被两个主教攻击到,然后被一个主教攻击到的位置上获得得 ...
- Codeforces Round #264 (Div. 2) C Gargari and Bishops 【暴力】
称号: 意甲冠军:给定一个矩阵,每格我们有一个数,然后把两个大象,我希望能够吃的对角线上的所有数字.我问两个最大的大象可以吃值. 分析:这种想法是暴力的主题,计算出每一格放象的话能得到多少钱,然后求出 ...
- Codeforces Round #485 (Div. 2) E. Petr and Permutations
Codeforces Round #485 (Div. 2) E. Petr and Permutations 题目连接: http://codeforces.com/contest/987/prob ...
- Codeforces #344 Div.2
Codeforces #344 Div.2 Interview 题目描述:求两个序列的子序列或操作的和的最大值 solution 签到题 时间复杂度:\(O(n^2)\) Print Check 题目 ...
- Codeforces #345 Div.1
Codeforces #345 Div.1 打CF有助于提高做题的正确率. Watchmen 题目描述:求欧拉距离等于曼哈顿距离的点对个数. solution 签到题,其实就是求有多少对点在同一行或同 ...
- Codeforces Beta Round #27 (Codeforces format, Div. 2)
Codeforces Beta Round #27 (Codeforces format, Div. 2) http://codeforces.com/contest/27 A #include< ...
- Codeforces#441 Div.2 四小题
Codeforces#441 Div.2 四小题 链接 A. Trip For Meal 小熊维尼喜欢吃蜂蜜.他每天要在朋友家享用N次蜂蜜 , 朋友A到B家的距离是 a ,A到C家的距离是b ,B到C ...
- codeforces #592(Div.2)
codeforces #592(Div.2) A Pens and Pencils Tomorrow is a difficult day for Polycarp: he has to attend ...
随机推荐
- VS_VERSION_INFO
VS_VERSION_INFO这里可以修改ocx的版本号
- javascrit开发的基本代码结构的
今天看到群里一个demo,简单看了一下. 然后自己就写了一个通用的javascrit开发的基本代码结构的js文件. 代码例如以下: (function($,win){ //定义全局变量对象 var o ...
- Nutch的日志系统 分类: H3_NUTCH 2015-02-17 20:14 261人阅读 评论(0) 收藏
一.Nutch日志实现方式 1.Nutch使用slf4j作为日志接口,使用log4j作为具体实现.关于二者的基础,请参考 http://blog.csdn.net/jediael_lu/article ...
- stackedit
https://github.com/benweet/stackedit/ https://github.com/waltcow/blog/issues/4
- HDU - 3078 Network(暴力+LCA)
题目大意:给出n个点的权值.m条边,2种操作 0 u num,将第u个点的权值改成num k u v,询问u到v这条路上第k大的权值点 解题思路:该点的话直接该,找第k大的话直接暴力 #include ...
- [RxJS] Convert RxJS Subjects to Observables
The use of RxJS Subjects is common, but not without problems. In this lesson we will see how they ca ...
- IIS最大并发连接数 = 队列长度 + IIS最大并发工作线程数
深入理解IIS的多线程工作机制 首先让我们来看看IIS里面的这2个数字:最大并发连接数,队列长度.先说这2个数字在哪里看. 最大并发连接数:在IIS中选中一个网站,右键网站名称,在右键菜单中找到并 ...
- VS(Visual Studio)自动创建的文件格式
.sln:solution,解决方案文件: .vsxproj:解决方案下的项目文件: .vssettings:环境设置文件, 菜单栏 ⇒ [工具]⇒ [导入和导出设置]⇒ 进行环境设置的导入和导出操作 ...
- Double prefix overrides to provide 16-bit operand size in a 32/64 operating mode
A processor supports an operating mode in which the default address size is greater than 32 bits and ...
- [NPM] Use package.json variables in npm scripts
In this lesson we will show that you can leverage values that you already have provided in your pack ...