1. 程式人生 > >藍橋杯訓練——最長遞增子序列

藍橋杯訓練——最長遞增子序列

問題描述:最長遞增子序列
習題3.4 最長連續遞增子序列(20 分)
給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。
輸入格式:
輸入第1行給出正整數n(≤10
​5
​​ );第2行給出n個整數,其間以空格分隔。
輸出格式:
在一行中輸出第一次出現的最長連續遞增子序列,數字之間用空格分隔,序列結尾不能有多餘空格。
輸入樣例:
15
1 9 2 5 7 3 4 6 8 0 11 15 17 17 10
輸出樣例:


3 4 6 8
作者:何知令

完成時間:2017年9月16日

程式碼:

/*
問題描述:最長遞增子序列
習題3.4 最長連續遞增子序列(20 分)
給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。
輸入格式:
輸入第1行給出正整數n(≤10
​5
​​ );第2行給出n個整數,其間以空格分隔。
輸出格式:
在一行中輸出第一次出現的最長連續遞增子序列,數字之間用空格分隔,序列結尾不能有多餘空格。
輸入樣例:
15
1 9 2 5 7 3 4 6 8 0 11 15 17 17 10
輸出樣例:

3 4 6 8
作者:何知令
完成時間:2017年9月16日
*/

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i,j,m;
    int n;
    int num[100000];
    int ans[100000];
    int maxlen=0,len;
    while(~scanf("%d",&n))
    {
        for(i=0; i<n; i++)
            scanf("%d",&num[i]);
        i=0;
        len=0;
        while(num[i]>=0&&num[i]<=9)
        {
            if(num[i+1]>num[i])
            {
                len++;
                i++;
                continue;
            }
            else
            {
                if(maxlen<len)
                {
                    maxlen=len;
                    m=i;
                    for(j=maxlen; j>=0; j--,m--)
                        ans[j]=num[m];
                    len=0;
                }
                else
                    len=0;
            }
            i++;
        }
        printf("%d",ans[0]);
        for(i=1; ans[i]!='\0'; i++)
            printf(" %d",ans[i]);
        printf("\n");
    }
    return 0;
}
知識點總結:..
學習心得:..