动态规划基础——最长非增子序列

题目比较简单,就是在一个数组里面找出最长的非增子序列,要注意,并不要求连续。

如:6,7,2,4,5,3最长的非增子序列是7,5,3而不是5,3.

动态规划的思想就是自底向上,求解问题:

 如:f(n) = f(n-1) + f(n-2);

       f(1) = a; f(2) = b;

运用已知结果来求得未知。

代码如下:

#include<stdio.h>
#include<stdlib.h>
void NoIncreaseSubSeq(int data[], int length){
    int (*status[100]), maxlength[100],templength = 0;

    //遍历整个数组
    for(int j = 0; j < length; j++)
    {
        //为每个状态分配空间(最多为j+1个),各子序列初始状态长度为1
      status[j] = (int*)malloc(sizeof(int) * (j + 1));
      status[j][0] = data[j];
      maxlength[j] = 1;
      //遍历已有最优子序列
      for(int i = 0; i < j ; i++ )
             //满足非增条件
             if( data[j] <= status[i][maxlength[i] - 1] )
             {
              templength = maxlength[i] + 1;
              //比之前更优
              if(templength >= maxlength[j])
              {
                       maxlength[j] = templength;
                 //优化子序列
                 for(int k = 0;k < maxlength[i]; k++)
                 {
                  status[j][k] = status[i][k];
                 }
                 status[j][maxlength[j] - 1] =data[j];
              }
             }           
    }
    //打印结果,并释放内存空间
        for(int j = 0; j < length; j++)
        {
            printf("第%d个最优子序列:\n",j);
           for(int i = 0; i <= maxlength[j] - 1; i++)
           {
             printf("%d ",status[j][i]);
           }
           free(status[j]);
           printf("\n");
        }
}
int main()
{
    int data[] = {1,2,2,3,8,19,17,13,1,2,5,4,8,1,9};
    //计算得出length长度
    int length = sizeof(data) / sizeof(int);
    NoIncreaseSubSeq(data,length);
    return 1;
}

 

posted @ 2013-06-22 15:35  idealing  阅读(407)  评论(0)    收藏  举报