Codeforces Round #264 (Div. 2) D. Gargari and Permutations DP

链接:

http://codeforces.com/contest/463/problem/D

题意:

给出k个排列,问这k个排列的最长公共子序列的长度。

题解:

首先cnt记录的是i在j的前面有多少个,因为是k的排列的公共子序列,所以只有当cnt[i][j]==k的时候才会考虑

然后就是求这么多组边能连起来的最长路径,就有点类似dijkstra了

代码:

31 int n, k;
32 int a[MAXN];
33 int cnt[MAXN][MAXN];
34 VI G[MAXN];
35 int dp[MAXN];
36 
37 int main() {
38     ios::sync_with_stdio(false), cin.tie(0);
39     cin >> n >> k;
40     rep(i, 0, k) {
41         rep(j, 0, n) cin >> a[j];
42         rep(p, 0, n) rep(q, p + 1, n) cnt[a[p]][a[q]]++;
43     }
44     rep(i, 1, n + 1) rep(j, 1, n + 1) if (cnt[i][j] == k) G[j].pb(i);
45     queue<int> que;
46     rep(i, 1, n + 1) if (!G[i].empty()) que.push(i);
47     while (!que.empty()) {
48         int u = que.front(); que.pop();
49         rep(i, 0, G[u].size()) {
50             int v = G[u][i];
51             if (dp[v] < dp[u] + 1) {
52                 dp[v] = dp[u] + 1;
53                 que.push(v);
54             }
55         }
56     }
57     int ans = 0;
58     rep(i, 1, n + 1) ans = max(ans, dp[i]);
59     cout << ans + 1 << endl;
60     return 0;
61 }

 

posted @ 2017-08-12 10:31  Flowersea  阅读(100)  评论(0编辑  收藏  举报