5-2 最長連續遞增子序列
阿新 • • 發佈:2018-12-24
給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。
輸入格式:
輸入第1行給出正整數nnn(≤105\le 10^5≤105);第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; }