自己参考网上的代码写的,时间复杂度是n^2,但是网上的代码好像都没有把最大升序列给打印出来,所以我给简单的补充,产生自己的东西了。但是写了这么多行,我可能写的复杂了。
//最大升序子列
#include <iostream>
#include <vector>
#include <stdio.h>
using namespace std;
struct Up
{
vector <int> mn; //记录主序列
vector <int> level; //用于表示该节点的最大升序长度
vector <int> prt; //用于表示要求的最大子列在该节点的前一个节点下标
};
typedef struct Up Up;
int Findmax (Up &up)
{
int i=0,j=0;
int max1=0,maxi=0;
for (i=1;i<up.mn.size();i++)
{
for (j=0;j<i;j++)
{
if (up.mn[i]>up.mn[j]&&up.level[i]<=up.level[j])
{
up.level[i]=up.level[j]+1;
up.prt[i]=j;
}
}
}
for (i=0;i<up.mn.size();i++)
{
if (up.level[i]>max1)
{
max1=up.level[i];
maxi=i;
}
}
cout<<"多长"<<max1<<endl;
return maxi;
}
int main()
{
Up up;
int a,maxi;
freopen("1.txt","r",stdin);
while (cin>>a)
{
up.mn.push_back(a);
up.level.push_back(1);
up.prt.push_back(0);
}
maxi=Findmax(up);
for (int i=up.level[maxi];i>0;i--) //打印最大子序列降序输出
{
cout<<up.mn[maxi]<<ends;
maxi=up.prt[maxi];
}
}
写的不好多多指教哈,还有一个测试用的1.txt,我就不附上来了,基本思路和n^2解法一样的。