第7周作业3——最长递增子序列

(3) 最长递增子序列 。见博文  最长递增子序列详解(longest increasing subsequence) 对此问题的解释,请先编程输出10个元素一组的随机整数数列,然后利用动态规划算法求其最长递增子序列的长度 及 具体的子序列,请多次测试与验证所编写的算法。
#include <iostream>  
#include <iterator>  
#include <time.h>  
#include <vector>  
using namespace std;  
  
#define MAXNUM 10  
  
int MaxLPre[MAXNUM];  
  
void CreateRAdjTable(vector<int> &list,vector<int> *RAdjTable)   
{  
    int size=list.size();  
    for(int i=0;i<size-1;i++)  
        for(int j=i+1;j<size;j++)  
        {  
            if(list[i]<list[j]) RAdjTable[j].push_back(i);  
        }  
}  
  
int MaxL(const vector<int> &list,vector<int> *RAdjTable,int *L,int j)  
{  
    int maxl=0;  
    for(int i=0;i<RAdjTable[j].size();i++)  
    {  
        if(L[ RAdjTable[j][i] ]>maxl)   
        {  
            maxl=L[ RAdjTable[j][i] ];  
            MaxLPre[j]=RAdjTable[j][i];            
        }  
    }  
    return maxl;  
}  
  
void CreateLS(const vector<int> &list,vector<int> *RAdjTable,int *L)  
{  
    for(int j=0;j<MAXNUM;j++)  
        if( RAdjTable[j].empty() )   
        {  
            L[j]=1;      
            MaxLPre[j]=-1;  
        }  
        else  
        {  
            L[j]=1+MaxL(list,RAdjTable,L,j);  
        }  
}  
  
void ShowPath(const vector<int> &list,int j)  
{  
    vector<int> stack;  
    while(j != -1)  
    {  
        stack.push_back(list[j]);  
        j=MaxLPre[j];  
    }  
    while(!stack.empty())  
    {  
        cout<<stack.back()<<"\t";  
        stack.pop_back();  
    }  
    cout<<endl;  
}  
  
void main()  
{  
    vector<int> list;  
    vector<int> RAdjTable[MAXNUM];  

    int L[MAXNUM];  
    srand(time(0)); 
	
    while(list.size() != MAXNUM)  
    {  
        list.push_back(rand()%100);  
    } 
	
	cout<<"第一行为随机产生的元素列,第二行为数组序号。(默认是10个随机数)"<<endl;
	cout<<endl;

    copy(list.begin(),list.end(),ostream_iterator<int>(cout,"\t"));  
    cout<<endl;  

    CreateRAdjTable(list,RAdjTable);  
    CreateLS(list,RAdjTable,L); 
	
    for(int m=0;m<MAXNUM;m++)      
	cout<<L[m]<<"\t";  
    cout<<endl;  
  
    cout<<"最长递增子序列为:"<<endl;
	cout<<endl;

    int j=0;  
    for(int n=0;n<MAXNUM;n++)  
		if(L[n]>L[j]) j=n;  
    ShowPath(list,j); 
	cout<<endl;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值