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;
    }
    
    
  • 相关阅读:
    关于信号量sem_wait的整理(转)
    WPF版的正则表达式工具开发完成
    F#中的Tuples、函数类型和参数柯里化
    一个WPF版的类Vista的地址栏控件Breadcrumb Bar
    多文档版的的正则表达式工具
    Reactive Extensions for .NET (Rx)
    解决下载的电子书中换行的问题
    WPF下的语法高亮控件——AvalonEdit
    把正则表达式测试工具界面更新为Aero效果的了
    Blend可以支持.net 4.0的工程了
  • 原文地址:https://www.cnblogs.com/albert-biu/p/11212073.html
Copyright © 2011-2022 走看看