最长有序子序列及其路径

来源:互联网 发布:海量数据股票目标价 编辑:程序博客网 时间:2024/06/07 15:34
 #include<iostream> #include<string.h> #define N 8 using namespace std; int a[N] = {5, 1, 2, 6, 5, 6,2,1 }; //int a[10] = {6,5,4,2,9,1,5,12,3,2};int f[N];int l[N];//表示路径。int e = 0; int main()  //找最长递减子序列。 {    void printl(int);  //用于打印路径    int i;    memset(l,-1,sizeof(l));  //memset 只能初始化0 和-1.    memset(f,0,sizeof(f));    f[0] = 1;    int max = f[0];    for(i = 1; i<N; i++)    {        for(int j = 0; j<i; j++)            if(a[i] < a[j] && f[i]<f[j])//a[j]<a[i]:递增子序列;a[j]<=a[i]不减子序列            {                       //a[j]>a[i]:递减子序列;a[j]>=a[i]不增子序列                f[i] = f[j];                l[i] = j;            }        f[i] ++;  //将自身加上。        if(max<f[i])        {             max = f[i];             e = i;  //现在路径的end 位置。        }    }  //  for(i = 0; i<N; i++)     //   cout<<l[i]<<"  ";   // cout<<endl;   // cout<<l[e];   // cout<<e<<endl;    cout<<max<<endl;    printl(e);    return 0; }void printl(int e){    if(l[e] != -1)        printl(l[e]);    cout<<a[e]<<" ";}