pta 习题集 5-5 最长连续递增子序列 (dp)

来源:互联网 发布:centos输入法设置 编辑:程序博客网 时间:2024/05/09 19:48

给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。

输入格式:

输入第1行给出正整数nn≤105105);第2行给出nn个整数,其间以空格分隔。 

输出格式:

在一行中输出第一次出现的最长连续递增子序列,数字之间用空格分隔,序列结尾不能有多余空格。

输入样例:

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

输出样例:

3 4 6 8
#include <iostream>#include <string.h>#include <stdlib.h>#include <stdio.h>#include <math.h>#include <string>#include <map>using namespace std;const int maxn=1e5;int n;int a[maxn+5];int dp[maxn+5];int search(int num,int l,int r){int mid;while(l<=r){mid=(l+r)/2;if(num>dp[mid])l=mid+1;elser=mid-1;}return l;}int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}memset(dp,0,sizeof(dp));dp[1]=1;for(int i=2;i<=n;i++){if(a[i]>a[i-1])dp[i]=dp[i-1]+1;elsedp[i]=1;}int max=0;int pos=0;for(int i=n;i>=1;i--){if(max<=dp[i]){max=dp[i];pos=i;}}for(int i=pos-dp[pos]+1;i<=pos;i++){if(i!=pos)printf("%d ",a[i]);elseprintf("%d\n",a[i]);}return 0;}


0 0
原创粉丝点击