Programe_Of_Beauty:2.16 求数组中最长递增子序列
2011-06-12 14:05 x_feng 阅读(180) 评论(0) 收藏 举报问题:写一个时间复杂度尽可能低的程序,求一个一维数组中最长递增子序列的长度。如1,-1,2,-3,4,-5,6,-7.最长递增子序列:1,2,4,6或者-1,2,4,6…
分析:我们发现2前面是1或者-1对后面没有影响。用i来遍历数组。i=0时,arr[i] = 1就一个数,这时最长递增子序列为{1},i=1时,-1<1所以对-1来说,目前最长递增子序列为{-1}为1,i= 2时,2>1,2>-1对2来说,最长递增子序列为{1,2}或{-1,2}长度为2,当i = 3时,-3小于1,-1,2.所以当前最长子序列依然是{1,2}或{-1,2}长度为2,当i= 4时,4>-1,4>-1,4>2,4>-3再逐个比较,代码如下:
int BigSubAdd(int *arr, int n)
{
int * Lis = new int[n];//用来记录以当前数字为结尾的最长递增子序列
for (int i = 0; i < n; i++)
{
Lis[i] = 1;//初始每一个数字本身都是长度为1的子序列
for (int j = 0; j < i; j++)//考察i前面所有的数字
{
if (arr[i] > arr[j] && Lis[j] + 1 > Lis[i])//我们发现这里重复比较了,能否有改进呢?让arr[i]只与前面的最长子序列的最大值比较
{
Lis[i] = Lis[j] + 1;//更新以i为结尾的最长子序列
}
}
}
delete[] Lis;
return Max(List);
}改进:详见《编程之美》,自己想了一个方法,发现不完善,在改进中…………
浙公网安备 33010602011771号