最长增加子序列问题是找到给定序列的最长子序列的长度,以使该子序列的所有元素都按升序排序。
例如,{10、22、9、33、21、50、41、60、80}的最长子序列长度为6,最长子序列为{10、22、33、50、60、80}。
设定输入数组为arr[0 1 … n-1],L[i]表示arr[0 1 … i]的最长子序列的长度,arr[i]为当前最长子序列的最后一个元素。
L[i]可以递归的表示为:
L[i] = 1 + max( L[j] ), 0 < j < i, arr[j] < arr[i]
L[i] = 1, 如果j不存在
下面是采用动态规划求解该问题的代码:
class LIS
{
public int lis(int arr[],int n)
{
int lis[] = new int[n];
int i,j,max = 0;
/* 初始化*/
for ( i = 0; i < n; i++ )
{
lis[i] = 1;
}
for ( i = 1; i < n; i++ )
{
for ( j = 0; j < i; j++ )
{
if ( arr[i] > arr[j] && lis[i] < lis[j] + 1)
lis[i] = lis[j] + 1;
}
}
/* 选出最大值即为最长的递增子序列长度 */
for ( i = 0; i < n; i++ )
{
if ( max < lis[i] )
max = lis[i];
}
return max;
}
}