zoukankan      html  css  js  c++  java
  • ZOJ2432 Greatest Common Increasing Subsequence(最长公共上升子序列)

    Greatest Common Increasing Subsequence
    Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge
    You are given two sequences of integer numbers. Write a program to determine their common increasing subsequence of maximal
    possible length.
    Sequence S1, S2, ..., SN of length N is called an increasing subsequence of a sequence A1, A2, ..., AM of length M if there exist 1 <= i1 < i2 < ...< iN <= M such that Sj = Aij for all 1 <= j <= N, and Sj < Sj+1 for all 1 <= j < N.

    Input

    Each sequence is described with M - its length (1 <= M <= 500) and M integer numbers Ai (-2^31 <= Ai < 2^31) - the sequence itself.

    Output

    On the first line of the output print L - the length of the greatest common increasing subsequence of both sequences. On the second line print the subsequence itself. If there are several possible answers, output any of them.

    This problem contains multiple test cases!

    The first line of a multiple input is an integer N, then a blank line followed by N input blocks. Each input block is in the format indicated in the problem description. There is a blank line between input blocks.

    The output format consists of N output blocks. There is a blank line between output blocks.

    Sample Input

    1

    5
    1 4 2 5 -12
    4
    -12 1 2 4

    Sample Output

    2
    1 4
    Source: Northeastern Europe 2003, Northern Subregion

    #include "bits/stdc++.h"
    
    using namespace std;
    typedef long long ll;
    const int mod = 1e9 + 7;
    const int maxn = 1e5 + 100;
    const int inf = 0x3f3f3f3f;
    
    int pre[600][600];
    int f[600][600];
    int a[600], b[600];
    
    int n, m;
    
    void work(int x, int y, int z) {
        if (z == 0) return;
        while (a[x] != b[y]) x--;
        work(x, pre[x][y], z - 1);
        printf("%d ", b[y]);
    }
    
    void slove() {
        int out = 0;
        int pp;
        for (int i = 1; i <= n; i++) {
            int k = 0, maxx = 0;
            for (int j = 1; j <= m; j++) {
                if (a[i] == b[j]) {
                    f[i][j] = f[i - 1][k] + 1;
                    pre[i][j] = k;
                } else {
                    f[i][j] = f[i - 1][j];
                }
                if (b[j] < a[i]) {
                    if (f[i - 1][j] > maxx) {
                        maxx = f[i - 1][j];
                        k = j;
                    }
                }
                if (f[i][j] > out) {
                    out = f[i][j];
                    pp = j;
                }
            }
        }
        printf("%d
    ", out);
        work(n, pp, out);
    }
    
    void init() {
        memset(f, 0, sizeof(f));
    }
    
    int main() {
    //    freopen("in.txt", "r", stdin);
        int _;
        scanf("%d", &_);
        while (_--) {
            init();
            scanf("%d", &n);
            for (int i = 1; i <= n; i++) {
                scanf("%d", &a[i]);
            }
            scanf("%d", &m);
            for (int i = 1; i <= m; i++) {
                scanf("%d", &b[i]);
            }
            slove();
            if (_) printf("
    ");
        }
        return 0;
    }
    
    
  • 相关阅读:
    [网页基础]DIV+CSS学习笔记(一)CSS的引入及选择器基础
    [网页基础]CSS+DIV布局,简单布局例子
    [C#]结构体和类的区别
    [网页基础]DIV+CSS学习笔记(二)深入理解盒子模型
    [数据库]mysql存储过程的建立及使用
    [网页基础]DIV+CSS学习笔记(三)盒子的定位与浮动
    [C#]List的Sort()、Find()、FindAll()、Exist()的使用方法举例
    Java实现断点续传和原理
    Minio的Docker部署dockercompose启动流程
    ShardingJDBC
  • 原文地址:https://www.cnblogs.com/albert-biu/p/11212073.html
Copyright © 2011-2022 走看看