最长单调递增子序列(LIS)

来源:互联网 发布:淘宝排名靠前技巧软件 编辑:程序博客网 时间:2024/05/21 22:34

1.最长单调递增子序列(O(n^2))

(可打印路径)

例如:打印出 2 5 4 3 9 7 8 的最长单调子序列;

① 引入数组c[ ] ,保存从0~i这一段序列,a[i]的最大长度;

②引入数组path[ ],表示c[i] 是由那个c[j] 值所得到的;

index0     1     2     3     4     5     6     a[i]2543978c[i]1222334path[i]-1000115

样例输出:2 5 7 8(输出是根据path[]记录路径输出的)

代码:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int a[100],n;int c[100],path[100];int LIS(){   int flag=0;   path[0]=-1;   c[0]=1;   for(int i=1;i<n;i++)   {       c[i]=1;       for(int j=0;j<i;j++)       {           if(a[i]>a[j]&&c[j]+1>c[i])           {               c[i]=c[j]+1;               path[i]=j;           }       }   }   int maxlen=0;   for(int i=0;i<n;i++)    //找到c[i]值最大,即为长度最长的子序列的下标;   {       if(c[i]>maxlen)       {           maxlen=c[i];           flag=i;       }   }   return flag;}void store(int flag)       //递归输出;{   if(flag==-1) return ;   else   {       store(path[flag]);       printf("%d ",a[flag]);   }}int main(){   while(~scanf("%d",&n))   {       memset(a,0,sizeof(a));       for(int i=0;i<n;i++)  scanf("%d",&a[i]);       int ans=LIS();           store(ans);       cout<<endl;   }   return 0;}



0 0
原创粉丝点击