类似排序的算法,答出给50分

来源:百度知道 编辑:UC知道 时间:2024/05/14 18:45:49
一个有序数列,有n个元素,取其子数列,按升序排序,字数列的元素最多是多少的算法

这是最长升序子序列的求法,是动态规划问题和排序无关……
看来是初学,那就先介绍一个基本算法然后简述一下优化方法,如果想要详细地优化方法再补充一下问题我看到再来回答好了。
算法核心部分是:
f[n]=1;
for(i=n-1;i>=0;i--)
{
max=0;
for(j=i+1;j<=n;j++)
{
if(h[j]>h[i]&&f[j]>max)max=f[j];
}
f[i]=max+1;
}
最终f[i]的最大值就是所求
对于某一个数字h[i]开头的最长子序列可以通过i之后的一个数字h[j]的最长子序列得出。如果h[j]>h[i]则满足上升要求,可能是最长子序列,如果比目前求得的大,那就是最长子序列,反复这个过程,就可以找出以i开头的最长子序列。
优化方法1:凸单调性优化,如果某一个元素比它后面的元素大,而以其开头的最长子序列和后面的那个元素一样长,那后面的元素永远不用考虑了,可以删去。
优化方法2:更新求得最长子序列,是O(NlogN)的复杂度,如果想学习,请看下面程序(求的是最长降序,但是思想可以看,他是Talor Lu发明的):
#include <stdio.h>
#define SIZE 200000
#define MAX(x,y) ((x)>(y)?(x):(y))

int best[SIZE]; // best[] holds values of the optimal sub-sequence

int
main (void) {
FILE *in = fopen ("input.txt", "r");
int i, n, k, x, sol;
int low, high;

fscanf (in, "%d", &n); // N = how many integers t