最长上升/下降序列

noi 4977 怪盗基德的滑翔翼

一、demo 最长上升序列

程序见Language C\LIS r1

基本思想

构造两个数组,num放序列内容,seq放以第i个元素为终点的最长上升序列,在seq中找最大值(max_element)即使整个序列的最大值。

步骤

  1. seq初始化为1
  2. 外循环n次,每次确定以fini为终点的最长子序列seq[fini]
    内循环star从头到fini-1,若num[star]<num[fini],则start可以作为子序列的一部分(给offer),要不要呢?以i为终点的最长子序列seq[fini]应该为 seq[star]+1 和原先seq[fini]中的最大值。
  3. 从seq中找到最大值
int LIS(int num[],int n)
{
    int seq[100];
    int len = 1;
    int fini,star;
    for(fini=0;fini<n;fini++)
        seq[fini]=1;
    for(fini=0;fini<n;fini++)
    {
        for(star=0;star<fini;star++)
        {
            if(num[star]<=num[fini])       //给offer了
                seq[fini]=max(seq[star]+1,seq[fini]);
        }
    }
    len=*(max_element(seq,seq+n));
    return len;
}

二、NOI4977

分最大上升子序列、最大下降子序列,分别计算,取最大值。
程序见Language C\prepare\noi4977

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。