最长递增子序列

来源:互联网 发布:网络阅读的利与弊例子 编辑:程序博客网 时间:2024/04/27 18:45

设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1<k2<…<km且aK1<ak2<…<akm。求最大的m值。
      在求以ai为末元素的最长递增子序列时,找到所有序号在L前面且小于ai的元素aj,即j<i且aj<ai。如果这样的元素存在,那么对所有aj,都有一个以aj为末元素的最长递增子序列的长度f(j),把其中最大的f(j)选出来,那么f(i)就等于最大的f(j)加上1,即以ai为末元素的最长递增子序列,等于以使f(j)最大的那个aj为末元素的递增子序列最末再加上ai;如果这样的元素不存在,那么ai自身构成一个长度为1的以ai为末元素的递增子序列。

#include <iostream.h>void main(){  int a[8]={1, 5, 8, 3, 6, 7, 2, 9 },f[8][8]={0};//f[i][j]在i后面添上元素加上j后序列的长度int len=sizeof(a)/sizeof(int);int maxlen=0;for(int i=0;i<len;i++)//从1到1,从i到i本省就有一个元素,故f[i][i]长度就是1f[i][i]=1;for(i=0;i<len;i++){int ma=0;for(int k=0;k<=i;k++)//找出从i到其前面所有元素的最大的长度值{if(f[k][i]>ma)ma=f[k][i];}if(ma>maxlen)maxlen=ma;for(int j=i+1;j<len;j++)//从i的下一个元素开始比较是不是比i的大{if(a[j]>a[i]){f[i][j]=ma+1;}}}cout<<maxlen<<endl;}


0 0
原创粉丝点击