最长有序子序列及其路径

 #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]<<" ";
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值