在数字序列A={
a
1
\displaystyle a_1
a1,
a
2
\displaystyle a_2
a2,…,
a
n
\displaystyle a_n
an}中按递增下标
(
i
1
,
i
2
,
.
.
.
,
i
k
)
(
(
i
≤
i
1
<
i
2
<
.
.
.
<
i
k
≤
n
)
)
(\displaystyle i_1,i_2,...,i_k)((i\leq i_1< i_2<...<i_k \leq n))
(i1,i2,...,ik)((i≤i1<i2<...<ik≤n))顺序选出一个子序列B,如果B中的数字都是严格递增的,则子序列B称为A的递增子序列。最长递增子序列就是要找出序列A的一个最长的递增子序列。
算法实现:
设序列A存储在数组a[n]中,数组L[n]存储最长递增子序列的长度,其中L[i]表示元素序列a[0]到a[i]的最长递增子序列的长度,二维数组x[n][n]存储对应的最长递增子序列,其中x[i][n]存储a[0]~a[i]的最长递增子序列,注意到数组下标均从0开始。
C++实现:
#include<iostream>
#include<cstring>
using namespace std;
int IncreaseOrder(int a[],int n)
{
int i,j,k,index;
int L[100],x[100][100];
for(i=0;i<n;i++) //最长递增子序列长度为1
{
L[i]=1;
x[i][0]=a[i];
}
for(i=1;i<n;i++)
{
int max=1;
for(j=i-1;j>=0;j--)
{
if((a[j]<a[i])&&(max<L[j]+1))
{
max=L[j]+1;
L[i]=max;
for(k=0;k<max-1;k++) //存储最长递增子序列
x[i][k]=x[j][k];
x[i][max-1]=a[i];
}
}
}
for(index=0,i=1;i<n;i++)
if(L[index]<L[i]) index=i;
cout<<"最长递增子序列是:";
for(i=0;i<L[index];i++)
cout<<x[index][i]<<" ";
return L[index];
}
int main()
{
int a[100];
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
int m=IncreaseOrder(a,n);
cout<<endl;
cout<<m;
return 0;
}
Java实现:
package NOll;
import java.util.*;
public class Main{
static int IncreaseOrder(int a[],int n)
{
int i,j,k,index;
int L[]=new int [100];
int x[][]=new int [100][100];
for(i=0;i<n;i++)
{
L[i]=1;
x[i][0]=a[i];
}
for(i=1;i<n;i++)
{
int max=1;
for(j=i-1;j>=0;j--)
{
if((a[j]<a[i])&&(max<L[j]+1))
{
max=L[j]+1;
L[i]=max;
for(k=0;k<max-1;k++)
x[i][k]=x[j][k];
x[i][max-1]=a[i];
}
}
}
for(index=0,i=1;i<n;i++)
if(L[index]<L[i]) index=i;
System.out.print("最长递增子序列是:");
for(i=0;i<L[index];i++)
System.out.print(x[index][i]+" ");
return L[index];
}
public static void main(String args[])
{
Scanner in=new Scanner(System.in);
int n,i;
int a[]=new int [100];
n=in.nextInt();
for(i=0;i<n;i++)
a[i]=in.nextInt();
int m=IncreaseOrder(a,n);
System.out.println();
System.out.print(m);
}
}