最长递增子串

View Code
#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);
}
原文地址:https://www.cnblogs.com/GoAhead/p/2749556.html