您的位置:首页 > 其它

最长上升/不下降子序列

2012-08-27 11:01 211 查看
最长上升/不下降子序列:(LIS)

有两种方法:

1.动态规划,O(n^2)

容易得出O(n^2)的DP递推公式:D[i]=max{D[j]}+1;(1<=j<i且E[j]<E[i])

D[i]为以元素i结尾的最长子序列个数。

这样经过两重循环一次遍历可以得到最长上升子序列。

代码:

View Code

#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
const int maxnum=100;
int a[maxnum];
int stack[maxnum];
int top=-1;

void function(int cur)
{
int l=0,r=top;
while(l<=r)
{
int m=(l+r)>>1;
if(stack[m]>=cur)  //递增,stack[m]>cur为非递减
r=m-1;
else
l=m+1;
}
if(l>top)
top=l;
stack[l]=cur;
}

int main()
{
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
function(a[i]);
}
printf("%d\n",top+1);
return 0;
}

/*
6
3 4 5 2 4 2
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: