这个代码里面用的是标准队列的基本运算,所以前面定义对的基本运算的代码比较长,其实真正核心算法还是比较简单的。大家如果不想让代码显的这么长的话,可以用数组实现队列的基本运算,那这个代码就短多了哟~只是我只要在代码库里面把队列运算代码拷过来就行,那是用起来就很方便了的~
#include<stdio.h>
#include<stdlib.h>
typedef struct
{int data;
int pos;
int num;
}node;
typedef struct
{node pos_mes[100];
int front,rear;
}sequeue;
sequeue *q;
node P;
int m,a[20],b[20],max[20];
void SETNULL(sequeue *sq)
{
sq->front=99;
sq->rear=99;
}
int EMPTY(sequeue *sq)
{
if(sq->rear==sq->front)
return 1;
else
return 0;
}
int ENQUEUE(sequeue *sq,node x)
{
if(sq->front==(sq->rear+1)%100)
return 0;
else
{
sq->rear=(sq->rear+1)%100;
sq->pos_mes[sq->rear]=x;
return 1;
}
}
node DEQUEUE(sequeue *sq)
{
node Z;
Z.data=-5; Z.pos=-5; Z.num=-5;
if(EMPTY(sq))
return Z;
else
{
sq->front=(sq->front+1)%100;
return (sq->pos_mes[sq->front]);
}
}
int BFS(int j)
{
int i;
node N;
N.data=a[j];N.num=1;N.pos=j;
ENQUEUE(q,N);
while(!EMPTY(q))
{
N=DEQUEUE(q);
for(i=N.pos+1;i<m;i++)
{
P.data=a[i];
P.pos=i;
P.num=N.num+1;
if(N.data>P.data)
ENQUEUE(q,P);
else
continue;
}
}
return N.num;
}
int f()
{
int i,x=0,j=0,min[20],da[20][20],k;
memset(min,0,sizeof(min));
memset(da,30001,sizeof(da));
da[0][0]=a[0];
for(i=1;i<m;i++)
{
for(j=0;j<=x;j++)
{
if(da[j][min[j]]>a[i])
{da[j][++min[j]]=a[i]; break;}
else
continue;
}
if(j>x)
{
min[j]=0;
da[j][min[j]]=a[i];
x=j;
}
}
return x+1;
}
int main()
{
int M=0,Max=0,i=0,count=0;
q=malloc(sizeof(sequeue));
SETNULL(q);
while(scanf("%d",&a[i])!=EOF)
i++;
m=i;
memset(b,0,sizeof(b));
memset(max,0,sizeof(max));
i=0;
while(i<m)
{
M=BFS(i);
if(Max<M)
Max=M;
i++;
}
count=f();
printf("%d/n",Max);
printf("%d/n",count);
return 0;
}