最长上升子序列问题

版权声明:@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;
}

猜你喜欢

转载自blog.csdn.net/lytwy123/article/details/83063519