最大递增子序列

//思路就是用d[i]来记录a[i]为结尾的子序列中最大递增子序列的长度,
//对于每一个i,令j从1到i - 1遍历,当a[j] < a[i],比较当前d[i]和每一个d[j] + 1的大小,将最大值赋给d[i]
int maxarray()//返回最长递增子序列
{
    int a[9]={2,1,5,3,6,4,8,9,7};//13489
    int dp[9]={0,};
    int i,j,max;
    int recored[9]={0,};
    for(i=0;i<9;i++)
    {
        dp[i] = 1;//一开始都为1
        for(j=0;j<i;j++)
        {   
            if(a[j] < a[i])
            {  
                dp[i] = maxValue(dp[i],dp[j]+1);
            }           
        }
    }
    //112233454
    //找到最大长度的数组下标
    int point = 0;
    max = dp[0];
    for(i=1;i<9;i++)
    {
        if(dp[i]>=max)
        {
            max = dp[i];
            point ++;

        }
    }
    j=max;
    recored[--j]  = a[point];
    for(i=point;i>=0;i--)
    {
        if(a[i]<a[point] && dp[i] == dp[point]-1)
        {
            recored[--j]= a[i];
            point =i;
        }
    }
    printf("\r\n");
    for(i=0;i<max;i++)
    {
        printf("%d ",recored[i]);
    }
    return 0;
}
//dp[i]既然是存放的是以a[i]为尾节点的最大递增子序列,所以假如在dp[i]的后边还存在一个比a[i]大的数,则相应的位置的dp[i]应该再加1
//也就是为什么if(a[j] < a[i])  dp[i] = maxValue(dp[i],dp[j]+1)存在的原因。现在是从前往后进行进行递归的运算。
dp  int[9]  0x1AEAEF64  
    dp[0]   int 1   
    dp[1]   int 1   
    dp[2]   int 2   
    dp[3]   int 2   
    dp[4]   int 3   
    dp[5]   int 3   
    dp[6]   int 4   
    dp[7]   int 5   
    dp[8]   int 4   

猜你喜欢

转载自blog.csdn.net/caogenwangbaoqiang/article/details/80777160