[北大机试D]:最大上升子序列和

总时间限制: 
1000ms

内存限制: 
65536kB
描述

一个数的序列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)等等。这些子序列中序列和最大为18,为子序列(1, 3, 5, 9)的和.

你的任务,就是对于给定的序列,求出最大上升子序列和。注意,最长的上升子序列的和不一定是最大的,比如序列(100, 1, 2, 3)的最大上升子序列和为100,而最长上升子序列为(1, 2, 3)

输入
输入的第一行是序列的长度N (1 <= N <= 1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000(可能重复)。
输出
最大上升子序列和
样例输入
7
1 7 3 5 9 4 8
样例输出
18

f[i]表示以a[i]结尾的最大上升子序列和。初始化:f[i] = a[i]状态转移:f[j] = max{f[j],a[j]+f[i]} (i<j)时间复杂度:O(n

2

)
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int a[1005],f[1005];
 5
 6 int main(){
 7     scanf("%d",&n);
 8     for (int i = 1;i <= n;++i){
 9         scanf("%d",a+i);
10         f[i] = a[i];
11     }
12     for (int i = 1;i < n;++i){
13         for (int j = i+1;j <= n;++j){
14             if (a[i] < a[j]){
15                 f[j] = max(f[j],a[j] + f[i]);
16             }
17         }
18     }
19     int ans = 0;
20     for (int i = 1;i <= n;++i) ans = max(ans,f[i]);
21     printf("%d\n",ans);
22     return 0;
23 }

原文地址:https://www.cnblogs.com/mizersy/p/12230894.html

时间: 2024-08-07 12:20:37

[北大机试D]:最大上升子序列和的相关文章

[北大机试A]:有趣的跳跃

总时间限制:  1000ms 内存限制:  65536kB 描述 一个长度为n(n>0)的序列中存在“有趣的跳跃”当前仅当相邻元素的差的绝对值经过排序后正好是从1到(n-1).例如,1 4 2 3存在“有趣的跳跃”,因为差的绝对值分别为3,2,1.当然,任何只包含单个元素的序列一定存在“有趣的跳跃”.你需要写一个程序判定给定序列是否存在“有趣的跳跃”. 输入 一行,第一个数是n(0 < n < 3000),为序列长度,接下来有n个整数,依次为序列中各元素,各元素的绝对值均不超过1,000

[北大机试B][OpenJ_Bailian-2965]:玛雅历

上周末,M.A. Ya教授对古老的玛雅有了一个重大发现.从一个古老的节绳(玛雅人用于记事的工具)中,教授发现玛雅人使用了一个一年有365天的叫做Haab的历法.这个Haab历法拥有19个月,在开始的18个月,一个月有20天,月份的名字分别是pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu.这些月份中的日期用0到19表示.Haab历的最后一个月叫

[北大机试F]:Wireless Network(并查集)

总时间限制:  10000ms 内存限制:  65536kB 描述 An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wireless network with the lap computers, but an unexpected aftershock attacked, all computers in the network were all

2014华为机试西安地区B组试题

2014华为机试西安地区B组试题 题目一.亮着点灯的盏数 一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.开始,电灯全部关着. 有n个学生从长廊穿过.第一个学生把号码凡是1的倍数的电灯的开关拉一下:接着第二个学生把号码凡是2的倍数的电灯的开关拉一下:接着第三个学生把号码凡是3的倍数的电灯的开关拉一下:如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下.n个学生按此规定走完后,长廊里电灯有几盏亮着. 注:电灯数和学生

清华大学软件2014机试

清华大学软件2014机试 By 钟桓 9月 24 2014 更新日期:9月 24 2014 今天刚刚机试完,乘者还没忘记,把自己知道的记下来,也算是泽被后来人吧~~~ 这次的机试题,相对来说,会更简单一点,总共3题,时间是3小时. 1 超级幸运数 题目大致描述: 一个数字,若是只含有1和4,这个数字就是幸运数,例如,14,114.但是514这样的就不是了,因为含有其它数字. 若这个幸运数字中,1和4的数量相同,那么就是超级幸运数,例如14,1144,41等等. 题目要求,输入一个n,n的范围是[

华为OJ机试训练(一)

题目1 -- 通过输入英文句子.将每一个单词反过来,标点符号顺序不变.非26个字母且非标点符号的情况就可以标识单词结束. 标点符号包含,.!? 比如输入:Hello, I need an apple. 输出: /** * 华为机试训练1: 通过输入英文句子,将每一个单词反过来.标点符号顺序不变.非26个字母且非标点符号的情况就可以标识单词结束. 标点符号包含,.!? * Hello, I need an apple. * * @author snail * */ public class Mai

[华为机试真题]66.单词搜索

题目 代码 /*--------------------------------------- * 日期:2015-07-06 * 作者:SJF0115 * 题目:WordSearch * 来源:华为机试真题 -----------------------------------------*/ #include <iostream> #include <string> #include <vector> #include <stack> #include

华为机试正式版(西安c/c++/java),今天下午去机试的题目,新鲜出炉了!

以下题目都是回忆的,题目都很简单, 大家有些基础就可以参加!(语言可以是c/c++,也可以是java的) 题目一(60分): 字符串操作, 将小写转换成大写, 将大写转化为小写, 数字的不做转换 例如, 输入:aBcD12 输出:AbCd12 题目二(100分): 将输入的字符串按照规定重新排序,如果字符串长度为奇数, 则中间的字符保持不变, 中间字符左侧降序排列, 右侧字符按照升序排列, 如果字符串长度为偶数,则左半侧字符降序排列,右半侧字符则按照升序排列 例如, 输入:ab5de 输出:ba

九度机试 题目1165:字符串匹配 2008年北京航空航天大学计算机研究生机试真题

题目1165:字符串匹配 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2497 解决:858 题目描述: 读入数据string[ ],然后读入一个短字符串.要求查找string[ ]中和短字符串的所有匹配,输出行号.匹配字符串.匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配.如"aa[123]bb",就是说aa1bb.aa2bb.aa3bb都算匹配. 输入: 输入有多组数据. 每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(