1. 程式人生 > >5-2 最長連續遞增子序列

5-2 最長連續遞增子序列

給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。

輸入格式:

輸入第1行給出正整數nnn≤105\le 10^5105);第2行給出nnn個整數,其間以空格分隔。

輸出格式:

在一行中輸出第一次出現的最長連續遞增子序列,數字之間用空格分隔,序列結尾不能有多餘空格。

輸入樣例:

15
1 9 2 5 7 3 4 6 8 0 11 15 17 17 10

輸出樣例:

3 4 6 8
#include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define maxsize 1000000
    using namespace std;
    typedef int element;
    typedef struct
    {
        element * elem;
        int length;
        int listsize;
    }sq;
    struct match
    {
        int c;
        int flag;
    }m;
    int lintlist(sq & l)
    {
        l.elem = (element *)malloc(maxsize * sizeof(element));
        if(!l.elem)
            return -1;
        l.length = 0;
        l.listsize = maxsize;
        return 0;
    }
    void creat(sq & l, int n)
    {
        for(int i = 0; i < n; i++)
            cin >> l.elem[i];
        l.length = n;
    }
    void find(sq & l1, sq & l2)
    {
        for(int i = 0; i < l1.length; i++)
        {
            int count = 0;
            for(int j = i; j < l1.length; j++)
            {
                if(l1.elem[j] < l1.elem[j + 1])
                {
                    count++;
                    l2.elem[i] = count;
                }
                else
                    break;
            }
        }
        int max = -1;
        int flag;
        for(int i = 0; i < l1.length; i++)
        {
            if(max < l2.elem[i])
            {
                max = l2.elem[i];
                flag = i;
            }
        }
        for(int i = flag; i < flag + max ; i++)
            cout << l1.elem[i] << " ";
        cout <<l1.elem[flag + max ] << endl;
    }
    int main()
    {
        sq l1, l2;
        int n;
        cin >> n;
        lintlist(l1);
        creat(l1,n);
        lintlist(l2);
        find(l1,l2);
        return 0;
    }