數組是亂序的,如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;
}