zoukankan      html  css  js  c++  java
  • 最长非降/下降子序列问题(DP)(待续...)

    注意:抽象成以下描述即为最长非降/下降子序列问题(一维状态

    问题描述:在一个无序的序列a1,a2,a3,a4…an里,找到一个最长的序列满足:(不要求连续

      ai<=aj<=ak…<=am,且i<j<k…<m.(最长非降子序列

      或 ai>aj>ak…>am,且i<j<k…<m.(最长下降子序列)

    问题分析:(以最长非降子序列为例)

      考虑状态数组opt[maxn]; 其中opt[i]表示a[i]时可与之前元素构成非降子序列的最大长度;可参考模板(随个人喜好,不唯一):

    for(int i = 1; i <= n; i++)
        {
            scanf("%d", &array[i][0]);
            array[i][1] = 1; //初始化到a[i]为止最长子序列长度为1;
        }
        for(int i = 2; i <= n; i++)
        {
            int len = 0;
            for(int j = 1; j < i; j++) //a[i]前的最长子序列
            {
                if(array[j][0] >= array[i][0] && array[j][1] > len) //注意此处的判断条件
                {
                    len = array[j][1];//更新最长最序列长度
                }
            }
            if(len > 0)
                array[i][1] = len + 1;//记录并更新a[i]处最长子序列长度
        }
    View Code
     1 for(int i = 1; i <= n; i++)
     2 {
     3         scanf("%d", &array[i]);
     4         opt[i] = 1; //初始化到a[i]时的最长子序列长度为1;
     5 }
     6 for(int i = 2; i <= n; i++)
     7 {
     8         int len = 0;
     9         for(int j = 1; j < i; j++)//a[i]前的子序列长度
    10         {
    11             if(array[j] >= array[i] && opt[j] > len)//注意此处的判断条件, 若求下降子序列则只需将>=改为<
    12             {
    13                 len = opt[j];//更新最长子序列长度
    14             }
    15         }
    16         if(len > 0)
    17             opt[i] = len + 1;//a[i]时子序列长度+1
    18 }
  • 相关阅读:
    javascript重点笔记
    我的CSS架构
    排行榜妙用——CSS计数器
    回归基础从新认识——HTML+CSS
    前端开发工具(安装及常用技巧)——sublime text 3
    手机访问php环境移动端静态页面
    H5前端面试题及答案(2)
    H5前端面试题及答案(1)
    python笔记--学会使用Fiddler
    python进程/线程/协成
  • 原文地址:https://www.cnblogs.com/LLGemini/p/3896110.html
Copyright © 2011-2022 走看看