zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    12.20个人任务总结
    典型用户和用户场景描述
    12.19冲刺总结
    12月18日任务总结
    构建之法阅读笔记02
    构建之法阅读笔记03
    构建之法阅读笔记01
    软件工程个人作业01
    内容提供者
    Pull解析Xml
  • 原文地址:https://www.cnblogs.com/baocong/p/7349178.html
Copyright © 2011-2022 走看看