首页 > 学院 > 开发设计 > 正文

上升子序列

2019-11-10 20:48:58
字体:
来源:转载
供稿:网友

PRoblem Description

一个只包含非负整数的序列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。对于给定的一个序列,求出它的最大的上升子序列的和。注意:最长的上升子序列的和不一定是最大的哦。

Input

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

Output

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

Example Input

71 7 3 5 9 4 8

Example Output

18

Hint

 

Author

01#include<stdio.h>
02int main()
03{
04    int i, n, a[1111], b[1111], j;
05    while(scanf("%d", &n) != EOF)
06    {
07        for(i = 0; i < n; i++)
08        {
09            scanf("%d", &a[i]);
10            b[i] = a[i];
11        }
12        for(i = 1; i < n; i++)
13        {
14            for(j = 0; j < i; j++)
15            {
16                if(a[j]<a[i])
17                {
18                    if(b[j]+a[i]>b[i])
19                    {
20                        b[i]=b[j]+a[i];  //得到最大的子序列
21                    }
22                }
23            }
24        }
25        int max = 0;
26        for(i = 0; i < n; i++)
27            if(b[i] > max) max = b[i];
28        printf("%d/n", max);
29    }
30    return 0;
31}

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表