(动态规划)最长递增子列

先来看问题,

最长递增子列。

即数组中按顺序拿出n个数,(按照原来的顺序)该子数列为递增数列。

例如:1 2 3 -1数列最后结果为3.最对应数列很显然为1 2 3

(注,只输出长度。)

当然如果还需要对应坐标对算法进行稍加改动即可

这里主要是对思路进行理解

   废话少说  下面我们开始讲解大致思路   (动态规划)

   我们对数组的前n个数即第一个,第二个   第n个  分别求出以第一个,第二个,  第n好个结尾的最长连续递增子序列  那么,当我们输入第n+1个数时我们只需往前比较,找到比第n+1位小的数 ,记做第X位  ,由于我们已经得到以第X位为结尾的最长连续递增子序列的长度(记做Y)  所以  我们的以n+1位位结尾的最长连续递增子序列即为Y+1

我们依次向前对比  记录比n+1为小的  并且对应长度的最最大值     加一即可

所以我们从第一位往后知道遍历结束   就可以得出以每一位为结尾的最长连续递增子序列的长度。   故我们就可以得出结果

当然你也可以得出对应序列   这里对得出序列的步骤就不具体讲了

下面  我们看具体代码

#include <stdio.h>

int Max(int a[][2],int n,int cont)//寻找
{
    int i;
    int max=0;
    for (i=n-1; i>=0; i--) {
        if (a[i][0]<cont) {
            if (a[i][1]>max) {
                max=a[i][1];
            }
        }
    }
    
    return max;
    
}
int main(int argc, const char * argv[]) {
    // insert code here...
    int n;
    scanf("%d",&n);
    int n1[n][2];
    int i;
    int max=1;
    for (i=0; i<n; i++) {
        scanf("%d",&n1[i][0]);
        n1[i][1]=Max(n1,i,n1[i][0])+1;//输入并寻找 赋值
        if (n1[i][1]>max) {
            max=n1[i][1];
        }
        
    }
    int n2[max];//存储子列
        printf("%d\n",max);//输出长度
    int m=max;//记录max
    for (i=n-1; i>=0; i--) {
        if (n1[i][1]==max) {
            n2[max-1]=n1[i][0];
               max--;
        }
    }
    for(i=0;i<m;i++)//输出
    {
        printf("%d ",n2[i]);
    }
    printf("\n");
    return 0;
}

这是测试输出结果图

这里也写了输出具体序列的代码    可以自己研究一下

  如果有什么不对的地方  或者不太看的懂的地方  评论区留言   

谢   !!

猜你喜欢

转载自www.cnblogs.com/cndccm/p/12207796.html