最长上升子序列的概念理解
上升序列:对于一个序列 a1<a2<a3…<an时,我们称这个序列是上升的
子序列:一个字符串 s 被称作另一个字符串 S 的子序列,说明从序列 S 通过去除某些元素但不破坏余下元素的相对位置(在前或在后)可得到序列 s 。
最长上升子序列:也就是在S中找到一个最长的子序列,且满足为一个上升序列
以4 2 1 3 5为例:就有2,3,5或者1,3,5这两个都是它的最长上升子序列
状态方程
用a[]数组存放某个序列
f[],f[i]存放来存放以a[i]为最长上升子序列的最后一个时,这个最长上升子序列的长度。
条件为:
过程图解
以2 5 3 4 1 7 6为例
此时最大值为4,则最长上升子序列的长度为4
c语言代码
代码样例(仅供参考)
#include <stdio.h>
int n,a[1001],b[1001],p[1001],c[1001],cou=0;
int main()
{int i,j,max=0,x=0;
scanf("%d",&n); // 输入个数
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)// 从第一个数到最后一个数
{ max=0;
x=0;
for(j=0;j<=i;j++)//以a[i]为最后一个的个数 ,当i前面有比他小的数,可以加入
{
if(a[j]<a[i]&&b[j]>max)// 比他小,并且找出在比他小的字母里以该字母为结尾时长度最长的一个
{
max=b[j];// 找出最大的 并记录下榻的位置
x=j;
}
}
b[i]=max+1;// 最大加一 ,并存放上一位是谁
p[i]=x;
}
for(i=0;i<n;i++)//找出最大的长度
if(b[i]>max)
{
max=b[i];
x=i;
}
printf("%d\n",max);//输出最大的长度是多大
while(max--)//
{
c[cou]=a[x];//从后面往前找出一个最长上升子序列,最大的就在c里面的第一个
cou++;
x=p[x];
}
for(i=cou-1;i>=0;i--)//输出最长。。。
printf("%d ",c[i]);
return 0;
}
运行样例