Longest Subqueuece最大升序子序列(算法实现)

问题对于给定一数据序列,怎样求出它的最大升序子序列长度。

如 :以序列 ak为例,为了求出最大子序列长度,我们可以将其分为几个子问题

即:求解以ak为终点的最大子序列的长度。

状态转移方程为:

                            

源码:

Code:
  1. #include <iostream>   
  2. #include <fstream>   
  3. #include <vector>   
  4.   
  5. using namespace std;   
  6. //定义结构体Info.保存一个终点的最长系列长度   
  7. struct Info{   
  8.     int index ;//下标   
  9.     int a;//元素值   
  10.     int length;//升序子序列长度编号   
  11. };   
  12.   
  13. vector<Info> v;//定义向量V 来保存所有的终点的数据信息;   
  14.   
  15. int main(int argc,char *argv[])   
  16. {   
  17.     //ifstream cin("aaa.txt");   
  18.     Info info;   
  19.     //测试案例个数为C   
  20.     int c;   
  21.     //每个测试案例中串的元素个数t   
  22.     int t;   
  23.     //单个元素   
  24.     int e;   
  25.     //元素计数器   
  26.     int n;   
  27.     //子序列最大长度存储在maxSqLength中   
  28.     int maxSqLength;   
  29.   
  30.     int i,j,k,p;   
  31.     cin>>c;   
  32.     for(i = 0 ; i < c ; i++)   
  33.     {   
  34.         //清空向量表   
  35.         v.clear();   
  36.         //初始化元素计数器   
  37.         n=0;   
  38.         //读入每个测度案例的个数   
  39.         cin>>t;   
  40.         //开始计算每个测试案例,给maxSqlenght赋值   
  41.         for(j = 0 ;j < t ; j++)   
  42.         {   
  43.             cin>>e;   
  44.             n++;   
  45.             v.push_back(info);//进栈   
  46.             v[n-1].index = n;//从0开始   
  47.             v[n-1].a = e;   
  48.             if(1 == n)   
  49.             {   
  50.                 v[n-1].length = 1;   
  51.                 continue;   
  52.             }   
  53.             //找出位于本元素之前,比本元素小但是子序列最长的那个长度值。   
  54.             maxSqLength = 0;   
  55.             for(k = 0;k < n; k++)   
  56.             {   
  57.                if(v[k].a < e)   
  58.                {   
  59.                    if(v[k].length > maxSqLength) maxSqLength = v[k].length;   
  60.                }   
  61.             }   
  62.             v[n-1].length = maxSqLength+1;   
  63.         }   
  64.         //找出本组测试案例中最长的子序列的长度;   
  65.         maxSqLength=0;   
  66.         for(p=0 ; p<n; p++)   
  67.         {   
  68.             //一维查询   
  69.             if(v[p].length > maxSqLength) maxSqLength=v[p].length;   
  70.         }   
  71.         if(i != 0)cout<<endl;   
  72.         cout<<maxSqLength<<endl;   
  73.     }   
  74.     return 0;   
  75. }  

测试结果:

Code:
  1. 2   
  2. 7   
  3. 1 8 3 9 4 7 9   
  4. 5   
  5. 3   
  6. 198 1 5   
  7.   
  8. 2   

具体分析参见源码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值