版权声明:@ly https://blog.csdn.net/lytwy123/article/details/83063519
最长上升子序列:给出一个数列{a1,a2,a3.....an},要求你选出尽量多的元素,使这些元素按其相对位置单调递增。
例如,
输入:5 8 9 2 3 1 7 4 6
输出:2 3 4 6
最长上升子序列长度为:4
#include<iostream>
using namespace std;
int b[200][4];
int main()
{
int n; //序列长度
int l,k;
cout<<"please input n"<<endl;
cin>>n;
for(int i = 1;i<=n;i++)
{
cin>>b[i][1]; //b[i][1]存储输入的序列
b[i][2] = 1; //b[i][2]表示从i位置到达n的最长的上升序列产能高度
b[i][3] = 0; //b[i][3]表示从i位置开始最长的上升序列的下一个位置,若为0则表示后面没有连接
}
//求最长上升序列
for(int i = n-1;i>=1;i--) //从最后一项开始
{
l = 0,k = 0;
for(int j = i+1;j<=n;j++)
{
if((b[j][1]>b[i][1]) && (b[j][2]>l))
{
l = b[j][2];
k = j;
}
if(l > 0)
{
b[i][2] = l+1;
b[i][3] = k;
}
}
}
//找出最长上升序列元素
k = 1;
for(int j = 1;j<=n;j++)
{
if(b[j][2]>b[k][2])
k = j;
}
cout<<"最长上升序列长度:"<<b[k][2]<<endl;
while(k != 0)
{
cout<<" "<<b[k][1];
k = b[k][3];
}
return 0;
}