您的位置:首页 > 其它

最长递增子序列问题

2008-06-21 00:02 176 查看
(一)最长递增子序列问题

1.问题描述
求一个由n个整数组成的整数序列的最长递增子序列。一个整数序列的递增子序列可以是序列中非连续的数按照原序列顺序排列而成的。最长递增子序列是其递增子序列中长度最长的。
2.具体要求(若在ACM平台上提交程序,必须按此要求)――平台上1700题
输入:输入的第一行是一个正整数n,表示测试例个数。接下来几行是n个测试例的数据,每个测试例的数据由两行组成,其中第一行为一个正整数k(k<=500),表示整数序列的长度,第二行给出整数序列,整数之间用一个空格隔开。(设给出的每个整数序列的最长递增子序列都是唯一的。)
输出:对于每个测试例输出两行,第一行为最长递增子序列的长度,第二行为最长递增子序列,整数之间用一个空格隔开。两个测试例的输出数据之间用一个空行隔开,最后一个测试例后无空行。
3.测试数据
输入:2
5

31423

6

139526

20

1271335102412491653683823113147

输出:3

123


4

1356


10

1235101216233147

4.设计与实现的提示
(1)寻找最优子结构、写出递归方程是问题的关键。
(2)以Ai为末元素的最长递增子序列(记为S(i)),等于以使S(j),(j=1~i),最大的那个Aj为末元素的递增子序列最末再加上Ai;如果这样的元素不存在,那么Ai自身构成一个长度为1的以Ai为末元素的递增子序列。
(3)最优解的信息在此是以Ai为末元素的最长递增子序列的前驱元素,应当记录下来。
5.扩展内容
本题可以采用多种方法求解,可以尝试用不同思路求解。

#include<iostream.h>
intq[100][100];
intp[100][100];
intzc(inta[100],intn,ints,intv)
{
intx=0,i,k=0,l=0;
if(s==0)
{x=1;}
else
{for(i=0;i<s;i++)
{if(a[s]>a[i])
{if(x-1<zc(a,n,i,v))
{x=zc(a,n,i,v)+1;
q[v][s]=i;
l=5;}}}}
if(l==0)
{x=1;}
returnx;
}
voidshuchu(inta[100],intv,intn)
{
inti,z,x=0;
for(i=0;i<n;i++)
{if(x<zc(a,n,i,v))
{x=zc(a,n,i,v);z=i;}
}
cout<<x<<endl;
for(i=0;i<x;i++)
{p[v][i]=z;z=q[v][z];}
for(i=0;i<x;i++)
{cout<<a[p[v][x-i-1]]<<"";}
}
voidmain()
{
intb[100][100];
intc,a[100],i,j,s;
cin>>c;
for(i=0;i<c;i++)
{
cin>>a[i];
for(j=0;j<a[i];j++)
{cin>>b[i][j];}
}
for(i=0;i<c;i++)
{
for(j=0;j<100;j++)
{q[i][j]=0;p[i][j]=0;}
shuchu(b[i],i,a[i]);
cout<<endl;cout<<endl;}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: