-
给定一个序列1,7,3,5,9,4,8.递增子序列为1,7是一个,1,3,5也是一个。但是最长的那个是1,3,5,8。
如何求出最长递增子序列的长度和最长递增子序列。
我们假设已经求出前N的递增长度子序列的长度了。求N+1的时候,n+1项的数据直接和前N项的数据挨个比较,然后找出前N的递增长度子序列长度最大的加1就行了。求递增子序列就是该过程的逆过程。找出递增最大的项M数据,然后减一,找前面的数据比M数据小,而且长度比其小一的数据就是成员之一。依次查找就可以找到最长递增能子序列。
代码如下:
#include
#include
#include
using namespace std;
void LIS(int intarr[], int length)
{
int *inttemp = new int[length];
for (int i = 0; i < length; i++)
{
inttemp[i] = 1;//赋值为1,因为单个的时候为1.
}
int maxLength = 0;//试试纪录最大的长度。
int maxi = 0;//实时记录最大长度的位置。
for (int i = 1; i < length; i++)
{
int maxL = 0;
int num = intarr[i];
for (int j = i - 1; j >= 0; j–)
{
if (num > intarr[j] && inttemp[j]>maxL)//寻找最大的长度
{
maxL = inttemp[j];
}
}
inttemp[i] = maxL + 1;
if (maxLength < inttemp[i])
{
maxi = i;
maxLength = inttemp[i];
}}
cout << maxi << " " << maxLength << endl;
cout << endl;
if (maxLength == 1)//长度为1的话,直接打印,返回即可。
{
cout << intarr[0] << endl;
return;
}
for (int i = 0; i < length; i++)
{
cout << inttemp[i] << “\t”;
}
cout << endl;int *intleng = new int[maxLength];
intleng[maxLength - 1] = intarr[maxi];
int maxLtemp = maxLength-1;
int weii = maxi;
int maxwei = maxLength - 2;
for (int i = maxi - 1; i >= 0; i–)
{
if (intarr[i] < intarr[weii] && inttemp[i] == maxLtemp)//获取最小的子序列。
{
intleng[maxwei] = intarr[i];
weii = i;
maxLtemp–;
maxwei–;
}
}
for (int i = 0; i < maxLength; i++)
{
cout << intleng[i] << " ";
}
cout << endl;
}
int main()
{
int intarr[20];
srand((unsigned)time(NULL));
for (int i = 0; i < 20; i++)
{
int val = rand() % 100;
cout << val << "\t";
intarr[i] = val;
}
cout << endl;
LIS(intarr,20);
system("pause");
return 0;
}
执行结果:
结果正确。