zoukankan      html  css  js  c++  java
  • 上升子序列(SDUT2171)

    上升子序列

    Time Limit: 1000MS Memory limit: 65536K

    题目描述

      一个只包含非负整数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列{a1, a2, ...,aN},我们可以得到一些上升的子序列{ai1, ai2, ..., aiK},这里1 ≤ i1 < i2 <...< iK ≤ N。例如:对于序列{1, 7, 3, 5, 9, 4, 8},有它的一些上升子序列,如{1, 7}, {3, 4, 8}等等。这些子序列中序列和最大的是子序列{1, 3, 5, 9},它的所有元素的和为18。
            对于给定的一个序列,求出它的最大上升子序列的和。
       注意:最长的上升子序列的和不一定是最大的哦。

    输入

    输入包含多组测试数据,对于每组测试数据:
    输入数据的第一行为序列的长度 n(1 ≤ n ≤ 1000),
    第二行为n个非负整数 b1,b2,...,bn(0 ≤ bi ≤ 1000)。

    输出

    对于每组测试数据,输出其最大上升子序列的和。

    示例输入

    7
    1 7 3 5 9 4 8

    示例输出

    18
     1 #include<stdio.h>
     2 #include<string.h>
     3 const int MAXN = 1000 ;
     4 int b[MAXN+10] ;
     5 int c[MAXN+10] ;//存储和
     6 int main()
     7 {
     8     int n,m,i,j ;
     9     while(~scanf("%d",&n) ){
    10     for(i = 1 ; i <= n ; i++)
    11     {
    12         scanf("%d",&b[i]) ;
    13     }
    14     int key = 0 ;
    15     for(i = 1 ; i <= n ; i++)
    16     {
    17         m = 0 ;
    18         for(j = 1 ; j < i ; j++)
    19         {
    20             if(b[i] > b[j])
    21             {
    22                     if(m < c[j])
    23                     m = c[j] ;
    24             }
    25         }
    26         c[i] = m + b[i] ;
    27         if(c[i] > key)
    28             key = c[i] ;
    29 
    30     }
    31     printf("%d\n",key) ;
    32     }
    33     return 0 ;
    34 }
    View Code

    要注意第一个for循环从头开始

  • 相关阅读:
    3747 [POI2015]Kinoman
    1303 [CQOI2009]中位数图
    3769 [spoj 8549] BST again
    1015 [JSOI2008]星球大战starwar
    1193 [HNOI2006]马步距离
    合并Git仓库不相关历史版本解决方案
    vue-cli项目实现动态锚点定位
    jQuery加css3实现菜单栏组件(可无限添加子列表)
    JavaScript文件转成base64编码
    Ajax获取服务器响应头部信息
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3111152.html
Copyright © 2011-2022 走看看