一个数的序列bi,当b1 <= b2 <= ... < =bS的时候,我们称这个序列是不下降的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些不下降的子序列(ai1, ai2, ..., aiK),这里1<= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些不下降子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8)。
Input
多组cas , 每组cas 两行:
第一行 输入一个数 n (n < 10000), 表示有n个数
第二行 n个数, 分别代表每个数;
Output
每个cas 一行 输出 该书数列的最长的长度 ;
Sample Input
7
1 7 3 5 9 4 8
Sample Output
输出最长的序列
#include<iostream>
using namespace std;
#define MAX 10001
void vInput(int nArr[],int nN);
int nGetResult(int nArr[],int nN);
void vOut(int nOut);
int nFind(int nUp[],int nV,int high,int low);
int main()
{
int nNum;
int nData[MAX];
int nAns;
while(1==scanf("%d",&nNum))
{
vInput(nData,nNum);
nAns=nGetResult(nData,nNum);
vOut(nAns);
}
return 0;
}
void vInput(int nArr[],int nN)
{
int i;
for(i=1;i<=nN;i++)
{
scanf("%d",&nArr[i]);
}
}
int nGetResult(int nArr[],int nN)
{
int i;
int upLimit[MAX];
int nCount;
int nPos;
for(i=1;i<=nN;i++)
{
upLimit[i]=nArr[nN];
}
nCount=1;
for(i=nN-1;i>=1;i--)
{
if(nArr[i]<=upLimit[nCount])
{
nCount++;
upLimit[nCount]=nArr[i];
}
else
{
if(nArr[i]>upLimit[1])
{
upLimit[1]=nArr[i];
}
else
{
nPos=nFind(upLimit,nArr[i],nCount,1);
upLimit[nPos]=nArr[i];
}
}
}
return nCount;
}
int nFind(int nUp[],int nV,int high,int low)
{
int nRet;
int nMid;
if(high==low)
{
nRet=high;
return nRet;
}
nMid=(high+low)/2;
if(nV>nUp[nMid])
{
nRet=nFind(nUp,nV,nMid,low);
}
else
{
nRet=nFind(nUp,nV,high,nMid+1);
}
return nRet;
}
void vOut(int nOut)
{
printf("%d\n",nOut);
}
版权声明:本文为wangxiaolongbob原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。