CF 463D (DP 或者 偏序)

给你k个长度为n的排列,求这些排列的最长公共子序列的长度

题解:k个都是一个排列,所以,每一个数在自己的的排列中只会出现一次,所以,我们可以记录每一个数在k个排列中的位置,然后就变成了k维偏序问题,a[i] <= a[j]

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1005;
struct node {
    vector<int> vec;
}a[maxn];
int dp[maxn];

bool cmp(node a, node b) {
    return a.vec[0] < b.vec[0];
}

int main() {
    int n, m, x;
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> x;
            a[x].vec.push_back(j);
        }
    }
    sort (a + 1, a + n + 1, cmp);
    int ans = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j < i; j++) {
            int flag = 1;
            for (int k = 0; k < m; k++) {
                if (a[i].vec[k] < a[j].vec[k]) {
                    flag = 0;
                }
            }
            if (flag) {
                dp[i] = max(dp[i], dp[j]);
            }
        }
        dp[i]++;
        ans = max(ans, dp[i]);
    }
    cout << ans << endl;
    return 0;
}
全部评论

相关推荐

秋盈丶:后续:我在宿舍群里和大学同学分享了这事儿,我好兄弟气不过把他挂到某脉上了,10w+阅读量几百条评论,直接干成精品贴子,爽
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务