最长上升子序列
- Description
-
一个数的序列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
- 输入的第一行是序列的长度N (1 <= N <= 1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。
- Output
最长上升子序列的长度。
Sample Input
7 1 7 3 5 9 4 8
Sample Output
4
这道题是动态规划的入门重要例题,是迈进动态规划的第一步,十分重要。
代码如下:
#include<cstdio>
#include<cstring>
int num[4][1001],n;
main()
{
memset(num[2],1,sizeof(num[2]));
memset(num[3],0,sizeof(num[3]));
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&num[1][i]);
for(int i=n-1;i>0;i--)
{
int x=0,y=0;
for(int j=i+1;j<=n;j++)
if(num[1][i]<num[1][j]&&num[2][j]>x)
{
x=num[2][j];
y=j;
}
if(x){num[2][i]=x+1;num[3][i]=y;}
}
int t=0,sum=0;
for(int i=1;i<=n;i++)
if(num[2][i]>=num[2][t])t=i;
while(t)
{
t=num[3][t];
sum++;
}
printf("%d\n",sum);
}