给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8},长度为4
这个算法采用DP策略,核心是维护一个END数组,其中END[i]代表以pArray[i]作为子数组的最后一个数时,这个子数组的最大长度,那么END[i+1]要么等于END[ j ]+1,要么等于1,0=<j<=i-1, 当END[i]等于1时候,说明pArray[i]比前面的
pArray[0]到pArray[i-1]都小,与前面的子序列不能构成递增序列。当END[i+1]等于END[ j ]+1的时候,说明pArray[i]>pArray[j], 从而与之构成递增子序列,所对应的最长子序列长度也就是END[ j ]+1;
代码如下:
int LIS(int *pArray,int nSize)
{
if (pArray==NULL)
{
return -1;
}
int *pLIS=new int[nSize];
pLIS[0]=1;
for (int i=1;i<nSize;i++)
{ pLIS[i]=1;
for (int j=0;j<i;j++)
{
if (pArray[i]>pArray[j]&&pLIS[j]+1>pLIS[i])
//这个判断决定pLIS[i]会取最大的那个
{
pLIS[i]=pLIS[j]+1;
}
}
}
delete []pLIS;
}