#include<IOSTREAM.H>
#include <IOMANIP.H>
#include <STRING.H>
#include <STDLIB.H>
//动态规划:需要一个数组b[n],其中b[i]是以x[i]结尾最长子串的长度,而b[i+1]=max(b[k]&&x[i+1]>x[k]}+1
void main()
{
char array[]="abcdgdfgdggefrte";
int *p=(int*)malloc(strlen(array)*sizeof(int));
p[0]=1;
for (int i=1;i<strlen(array);i++)
{
int temp=0;
for (int k=0;k<i;k++)
{
if (array[i]>array[k])
{
if (temp<p[k])
{
temp=p[k];
}
}
}
p[i]=temp+1;
}
for (i=0;i<strlen(array);i++)
{
cout<<setw(3)<<p[i];
}
int index=0;
int num=0,temp=index;
for (i=0;i<strlen(array);i++)
{
if(index<p[i])
{index=p[i];temp=i;}
}
cout<<array[temp];
while(num!=index)
{
for (int i=temp-1;i>=0;i--)
{
if(array[temp]>array[i]&&p[i]==p[temp]-1)
{
temp=i;cout<<array[i];break;
}
}
num++;
}
cout<<endl;
free(p);
}