编程之美这本书里面就有关于这道题的一些解法,求一个一位数组中的最长序列的长度。例如,在序列5,-1,2,-3,4,-5,6,9,-7中,最长递增序列是-1,2,4,6,9.
其中编程之美这本书中,主要讨论了对求最长序列的数组进行了讨论,其中代码如下:
int i,j;
int maxlen=1;
max_array[1]=a[0];
max_array[0]=-8;
for (i=0;i<n;i++)
max_len[i]=1;
for (i=1;i<n;i++)
{
for (j=maxlen;j>=0;j--)
{
if (a[i]>max_array[j])
{
max_len[i]=j+1;
break;
}
}
if (max_len[i]>maxlen)
{
maxlen=max_len[i];
max_array[max_len[i]]=a[i];
}
else if (max_array[j]<a[i] && a[i]<max_array[j+1])
{
max_array[j+1]=a[i];
}
}
而考虑到需要对返回最长的递增子序列,给出对应代码如下,如有什么问题请多指教!
void max_dz(int a[],int n,int max_array[],int *max)
{
//int max_array[MAXSIZE];
//int max_len[MAXSIZE];
//int b[MAXSIZE]={0};
/*
只求出了递增序列的最大值,而对应的最大递增序列没有求到
*/
/*int i,j;
int maxlen=1;
max_array[1]=a[0];
max_array[0]=-8;
for (i=0;i<n;i++)
max_len[i]=1;
for (i=1;i<n;i++)
{
for (j=maxlen;j>=0;j--)
{
if (a[i]>max_array[j])
{
max_len[i]=j+1;
break;
}
}
if (max_len[i]>maxlen)
{
maxlen=max_len[i];
max_array[max_len[i]]=a[i];
}
else if (max_array[j]<a[i] && a[i]<max_array[j+1])
{
max_array[j+1]=a[i];
}
}
*/
int temp;
int k=0;
int i,j,l;
int b[MAXSIZE]={0};
*max=0;
for (i=0;i<n;i++)
{
k=0;
temp=a[i];
//b[k]=temp;
for (j=i;j<n;j++) //寻找递增序列,并保存到b[]中
{
if (temp<a[j])
{
b[k++]=temp;
temp=a[j];
}
else
b[k]=temp;
}
if (*max<(k+1)) //如果找到的最大递增序列,并将起保存到c[]中
{
*max=(k+1);
for (l=0;l<*max;l++)
{
max_array[l]=b[l];
}
}
}
}
void main() { int a[]={5,-1,2,-3,4,-5,6,9,-7}; int len=sizeof(a)/sizeof(a[0]); int c[10]={0}; int i=0; int max=0; int n; max_dz(a,len,c,&max); n=max; for (i=0;i<n;i++) printf("%d ",c[i]); printf("\n"); printf("%d\n",max); system("pause"); }