您的位置:首页 > 其它

数组中最长递增子序列

2016-08-17 11:06 169 查看
数组是乱序的,如1,-1,2,-3,4,-5,6,-7

根据无后效性定义,数组中当前元素所形成的子序列与其前面元素形成的子序列没有关系,所以:

LIS[i+1] = max(1,LIS[k]+1),其中,array[i+1] > arry[k],且任意k<=i

LIS[i]存储对于当前数组arry[i]形成的最长子序列的长度值,若arry[i+1]>arry[k],那么第i+1个元素可以接在LIS[k]长的子序列后面+1构成一个更长的子序列,k是0~i之间的任意值。还要注意:LIS[K]的长度并不一定大于LIS[K-1]的长度(LIS[3]=1 < LIS[2]=2)。

代码如下:

/求数组中最长递增子序列
int LIS(vector<int> data)
{
if(data.empty())
return -1;
int length = data.size();
vector<int> lis(length,0);
for(int i = 0;i < length;++i)
{
lis[i] = 1;//每一个i长度至少为1
for(int j =0;j < i;++j)
{
if(data[i] > data[j] && lis[j] + 1 > lis[i])//lis[j]最终会取lis[j]中的最大值+1
lis[i] = lis[j] + 1;
}
}
int num = 0;
for(int i = 0;i < length;++i)
{
if(lis[i] > num)
num = lis[i];
}
return num;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: