最长上升子序列 题解

最长上升子序列
时间限制:1秒 内存限制:128M
题目描述


一个数的序列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).



你的任务,就是对于给定的序列,求出最长上升子序列的长度。

输入描述


输入的第一行是序列的长度N (1 <= N <= 1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。

输出描述


最长上升子序列的长度。

样例
输入
7
1 7 3 5 9 4 8
输出
4
提示

另一组测试数据

输入

43
486 341 527 189 740 490 388 989 489 711 174 305 844 971 492 998 954 832 442 424 619 906 154 293 395 439 735 738 915 453 748 786 550 871 932 693 326 53 904 732 835 354 364

输出

11 

为了写出最长的上升序列,我们定义了len[]数组来记录每个以num[i]结尾的上升子序列的长度。初始长度设为1,如满足(num[i]>num[j]&&len[i]<len[j]+1)判断条件-------前一个数比后一个数小,并且与len[j]+1,比较大小,从而得出以num[i]结尾的最长上升子序列,并用其长度与max------及存储总最长上升子序列的比较器,比较。得出最大的max,即为正解。

#include<iostream>
using namespace std;
int main()
{
int num[1005],len[1005];
int max=1,n;
cin>>n;
int i,j;
for(i=1;i<=n;i++)
{
cin>>num[i];
}
for(i=1;i<=n;i++)
{
len[i]=1;
for(j=1;j<i;j++)
{
if(num[i]>num[j]&&len[i]<len[j]+1)
{
len[i]=len[j]+1;
}
}
if(max<len[i])
{
max=len[i];
}
}
cout<<max;
return 0;
}

posted on 2020-07-29 12:01  田宸玮  阅读(435)  评论(0编辑  收藏  举报

导航