題目描述:設L=<a1,a2,…,an>是n個不同的實數的序列,L的遞增子序列是這樣一個子序列Lin=<aK1,ak2,…,akm>,其中k1<k2<…<km且aK1<ak2<…<akm。求最大的m值
代碼實現如下:
#include "stdio.h"
#include <iostream>
template < class T >
int GetLISLen(T * arr, int n)
{
if (n < 1 )
return 0 ;
int iCurrMaxLen = 0 ;
int left, right, mid;
int * last = new int [n]();
last[ 0 ] = arr[ 0 ];
for ( int i = 1 ; i < n; i ++ )
{
if (arr[i] >= last[iCurrMaxLen])
last[ ++ iCurrMaxLen] = arr[i];
else if (arr[i] < last[ 0 ])
last[ 0 ] = arr[i];
else
{
left = 0 ;
right = iCurrMaxLen;
while (left != right - 1 )
{
mid = (left + right) / 2 ;
(last[mid] <= arr[i]) ? (left = mid) : (right = mid);
}
last[right] = arr[i];
} // if
} // for
for ( i = 0 ; i < iCurrMaxLen + 1 ; i ++ )
{
printf( " %d " , last[i]);
if (i != iCurrMaxLen)
printf( " /x20 " );
else
printf( " /n " );
}
if (last)
{
delete [] last;
last = 0 ;
}
return iCurrMaxLen + 1 ;
}
int main()
{
int arr[11]={1,2,3,1,2,4,3,7,9,8,10};
GetLISLen(arr,11);
getchar();
return 0;
}
上述求解的最長遞增序列不要求連續,下面給出求最長連續遞增序列
template < class T >
int FindLongestConIncSubseq( const T * arr, int n, int * pos)
{
int start = 0 , end = 1 ;
int iMaxLen = 1 , iCurrLen = 1 ;
for (end = 1 ; end < n; end ++ )
{
if (arr[end] >= arr[end - 1 ])
{
iCurrLen ++ ;
}
else
{
if (iCurrLen > iMaxLen)
{
iMaxLen = iCurrLen;
start = end - iMaxLen;
}
iCurrLen = 1 ;
}
} // for
if (iCurrLen > iMaxLen)
{
iMaxLen = iCurrLen;
start = end - iMaxLen;
}
* pos = start;
return iMaxLen;
}