zoukankan      html  css  js  c++  java
  • pta 习题集 5-5 最长连续递增子序列 (dp)

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

    输入格式:

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

    输出格式:

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

    输入样例:

    15
    1 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;
    		else
    			r=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;
    		else
    			dp[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]);
    		else
    			printf("%d
    ",a[i]);
    	}
    	return 0;
    
    
    }


  • 相关阅读:
    [转]OC与JS的交互详解
    [iOS]数据库第三方框架FMDB详细讲解
    iOS开发-NSOperation与GCD区别
    iOS开发:深入理解GCD 第一篇
    iOS开发之集成ijkplayer视频直播
    iOS--KVO的实现原理与具体应用
    JAVA中Colllection的基本功能
    JAVA中的数组对象
    结对编程《四则运算》
    关于结对编程
  • 原文地址:https://www.cnblogs.com/dacc123/p/8228552.html
Copyright © 2011-2022 走看看