查找线性表中最长递增子序列
给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。
输入样例:
10
1 9 2 5 7 3 4 6 8 0
输出样例:
3 4 6 8
#include <stdio.h>
#include <malloc.h>
struct ming {
int data[1000];
int last;
};
struct ming* M;
struct ming* kongbiao(int a[], int n);
void zuichang(int i, int n);
int main()
{
int a[1000], b[1000];
int i = 0, n;
scanf_s("%d", &n);
M = (struct ming*)malloc(sizeof(struct ming));
M = kongbiao(a, n);
zuichang(i, n);
return 0;
}
struct ming* kongbiao(int a[], int n) //建立新表并赋值
{
struct ming* M;
int i = 0;
M = (struct ming*)malloc(sizeof(struct ming));
for (i = 0;i < n;i++)
{
scanf_s("%d", &a[i]);
M->data[i] = a[i];
}
M->last = n;
return M;
}
void zuichang(int i, int n) //查找最长递增子序列
{
int chazhi = 0, cishu = 0;
int k = 0;
int maxchang = 0, thischang = 1; //注意当前长度从自身,即1开始
for (i = 0;i < n;i++)
{
chazhi = M->data[i + 1] - M->data[i]; //后面减前面的差值大于0表示递增
if (chazhi > 0)
{
thischang++; //当前递增子序列长度
if (thischang > maxchang)
{
maxchang = thischang; //更换最大子序列长度
k = i + 1; //最新下标,位置记号
cishu++; //递增次数累加
}
}
else if (chazhi < 0)
{
thischang = 1; //重置当前序列长度
}
}
for (i = k - cishu;i <= k;i++) //k-cishu表示最长递增序列的头
{
printf("%d ", M->data[i]);
}
}
下面是我运行的结果