您的位置:首页 > 其它

最长上升子序列LIS

2016-10-04 17:31 295 查看
问题:

给定n个整数A1,A2,A3,A4,A5,….An,从左到右的顺序尽量选出多个整数,组成一个上升子序列,相邻元素不相等。例如:1,6,2,3,7,5,它的最长上升子序列为:1,2,3,5。

分析:

刚开始想这个问题的时候我想用递归来解决问题,可是后来考虑到递归的时间复杂度高,就觉得不能使用,并且本来就是在刷dp啊。想来很久,无果。在网上一看分析,就懂了。还是太菜啊。具体思路,序列很长,我就把它分成一个个很小的一段,不断拆分,当序列只有一个元素时,它的最长子序列为1,要是有两个呢,就得把第二个元素进行比较。所以就得出了想法,就是从考虑终点在哪里的问题,在终点以前已经得到了其最长字序列,就只需考虑最后一个元素的大小关系,这样一来,所以问题都觉解了。最小的子序列就是1,很容易得之,其他的就由最优的子序列不断得到。

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
#define INF 10000
int ar[INF];
int br[INF];
int N,MaxLen;
int main()
{
cin>>N;
MaxLen=0;
memset(br,1,sizeof(br));
for(int i=1;i<=N;i++)
cin>>ar[i];     //输入给定的数组
for(int i=1;i<=N;i++)
br[i]=1;      //表示第i个元素的最长长度
if(N==1)
{
cout<<1<<endl;
return 0;
}
for(int i=2;i<=N;i++)
{
int maxx=0;    //表示最优子结构的最大值
for(int j=1;j<=i-1;j++)          //比较终点ar[i]是否加入最长子结构中
if(ar[j]<ar[i]&&br[j]>=maxx)
maxx=br[j];
br[i]=maxx+1;
if(br[i]>MaxLen)
MaxLen=br[i];
}
cout<<MaxLen<<endl;
return 0;
}


这个方法的时间复杂度为N×N,还有nlog(n)的方法,下次再更新。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LIS