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;
    }
    
    
  • 相关阅读:
    如何设置ASP.NET页面的运行超时时间
    日志文件清理工具V1.1
    【原创】日志文件清理工具V1.0
    【分享】国外后台界面HTML源码 [免费]
    【分享】仿东软OA协同办公服务管理源码
    年底发福利了——分享一下我的.NET软件开发资源
    由12306动态验证码想到的ASP.NET实现动态GIF验证码(附源码)
    【分享】元旦送礼,商业源码免费赠送!
    给大家分享一个jQuery TAB插件演示
    【分享】双12了,也没啥可送大家的,就送大家点商业源码吧!
  • 原文地址:https://www.cnblogs.com/albert-biu/p/11212073.html
Copyright © 2011-2022 走看看