码迷,mamicode.com
首页 > 其他好文 > 详细

最长非降/下降子序列问题(DP)(待续...)

时间:2014-08-07 02:59:08      阅读:341      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   strong   for   

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

问题描述:在一个无序的序列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]时可与之前元素构成非降子序列的最大长度;可参考模板(随个人喜好,不唯一):

bubuko.com,布布扣
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 }

最长非降/下降子序列问题(DP)(待续...),布布扣,bubuko.com

最长非降/下降子序列问题(DP)(待续...)

标签:style   blog   http   color   os   io   strong   for   

原文地址:http://www.cnblogs.com/LLGemini/p/3896110.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!