1302: 最大子序列

时间限制: 1 Sec  内存限制: 128 MB

提交: 224  解决: 54

[提交][状态][讨论版]

题目描述

给定一个N个整数组成的序列,整数有正有负,找出两段不重叠的连续子序列,使得它们中整数的和最大。两段子序列都可以为空。

输入

多组输入,每组第一行为N,表示序列的长度;第二行为N个整数(-1000<=n<=1000),表示输入序列。
0<N<=1,000,000

输出

对于每组输入,输出一行,仅一个整数,表示最大的和。

样例输入

9
185 -580 -889 701 964 -878 353 -761 608

样例输出

2273
第一步,求出最大子序列M;M表示max
第二步,求出不与M相交的第二大子序列S;S表示second
第三步,求出M中的最小子序列L;L表示little
最后,分两种情况:M+S或者是M一分为二;
若S+L<0,说明L太小了,M应该舍弃L,一分为二;
否则,M+=S;
#include<iostream>
using namespace std;
int a[1000007];
int m[1000007];
int from, to;
int M, S, L;
int n;
void init(){
	int i;
	M = 0;
	m[0] = a[0];
	int f, t;
	f = t = 0;
	for (i = 1; i < n; i++)
	{
		if (m[i - 1]>0){
			m[i] = m[i - 1] + a[i];
			t++;
		}
		else{
			f = t = i;
			m[i] = a[i];
		}
		if (M < m[i]){
			M = m[i];
			from = f;
			to = t;
		}
	}
}
void getS(){
	int i;
	int mm = 0;
	for (i = 0; i < from; i++){
		if (m[i]>mm)
			mm = m[i];
	}
	int now = a[to + 1];
	for (i = to + 2; i < n; i++){
		if (now>0){
			now += a[i];
		}
		else{
			now = a[i];
		}
		if (now > mm)mm = now;
	}
	S = mm;
}
void getL(){
	int i;
	int ll = a[from];
	int now = a[from];
	for (i = from + 1; i < to + 1; i++){
		if (now<0){
			now += a[i];
		}
		else{
			now = a[i];
		}
		if (now < ll)ll = now;
	}
	L = ll;
}
int main(){
	freopen("in.txt", "r", stdin);
	while (scanf("%d", &n) != -1){
		int i;
		for (i = 0; i < n; i++){
			scanf("%d", &a[i]);
		}
		init();
		getS();
		getL();
		if (S + L < 0){
			M -= L;
		}
		else{
			M += S;
		}
		printf("%d\n", M);
	}
	return 0;
}

东大OJ-最大子序列问题的变形的更多相关文章

  1. POJ 1836 Alignment 最长递增子序列(LIS)的变形

    大致题意:给出一队士兵的身高,一开始不是按身高排序的.要求最少的人出列,使原序列的士兵的身高先递增后递减. 求递增和递减不难想到递增子序列,要求最少的人出列,也就是原队列的人要最多. 1 2 3 4 ...

  2. Light oj 1013 - Love Calculator (LCS变形)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1013 题意: 给你两个字符串,让你构造出一个长度最小的字符串,且它的子序列包含 ...

  3. 东大OJ 2SAT 异或

    看了十年才懂懂了十年才会会了十年才会写写了十年才写完写完了十年才能改对 #include<stdio.h> #include<string.h> struct res{ int ...

  4. 东大OJ-Max Area

    1034: Max Area 时间限制: 1 Sec  内存限制: 128 MB 提交: 40  解决: 6 [提交][状态][讨论版] 题目描述 又是这道题,请不要惊讶,也许你已经见过了,那就请你再 ...

  5. HDU 5791 Two ——(LCS变形)

    感觉就是最长公共子序列的一个变形(虽然我也没做过LCS啦= =). 转移方程见代码吧.这里有一个要说的地方,如果a[i] == a[j]的时候,为什么不需要像不等于的时候那样减去一个dp[i-1][j ...

  6. poj 2250 Compromise(区间dp)

    题目链接:http://poj.org/problem?id=2250 思路分析:最长公共子序列问题的变形,只是把字符变成了字符串,按照最长公共子序列的思路即可以求解. 代码如下: #include ...

  7. hdu1503 最长公共子序列变形

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1503 题意:给出两个字符串 要求输出包含两个字符串的所有字母的最短序列.注意输出的顺序不能 ...

  8. ACM: 强化训练-Beautiful People-最长递增子序列变形-DP

    199. Beautiful People time limit per test: 0.25 sec. memory limit per test: 65536 KB input: standard ...

  9. 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)

    题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...

随机推荐

  1. google-analytics.com

    最近有朋友问,为什么我的网站打开时在执行google analytics有较长的停顿时间.要如果解决?这个问题其实很早就有,最好的解决办法是将网站所有页面的传统追踪代码统一替换为最新的异步追踪代码.不 ...

  2. x01.Game.Main: 从零开始

    一切从零开始,一切皆有可能. 浅墨,90后,<逐梦之旅>深入浅出,堪比大师. 1.安装 DXSDK_June10.exe 或更新版本. 2.运行 vs2012,新建 VC Win32 空项 ...

  3. 预定义接口-迭代器Iterator

    <?php /* 可在内部迭代自己的外部迭代器或类的接口. Iterator extends Traversable { abstract public mixed current ( void ...

  4. 地图编辑器V3

    V3.2.4 (2014-07-03) ---------------------------1. 保存地图的锁定与可视状态:2. 地图单独存为map格式结尾的文件与导出的XML文件区别:3. 修正瓷 ...

  5. Binary search tree

    #ifndef __TREE_H #define __TREE_H #include <iostream> template<typename T> class TreeNod ...

  6. Nagios监控ganglia的指标

    这是nagios与ganglia整合的一部分内容 . 通常我们会把ganglia的监控发送给一个主机,我们可以在这个主机上执行nc localhost 8649 可以获取到所有发往这个主机的信息,以x ...

  7. linux下yum命令出现Loaded plugins: fastestmirror

    yum install的时候提示:Loaded plugins: fastestmirror fastestmirror是yum的一个加速插件,这里是插件提示信息是插件不能用了. 不能用就先别用呗,禁 ...

  8. 150922-写写博客监督下不自觉的自己-PPT,Linux,HTML

    开始学PHP的日子里,总是懒散的有一天没一天的.无意间听闻写博客来展示代码(现在还远远做不到哇),来监督个人每天的学习进度,鉴于自己还是爱写一点文字,但愿可以坚持下去. 凡是都喜欢有个计划,骨子里的理 ...

  9. 我是如何来做网站优化(Seo)的?(一)

    谈及网站优化(Seo)及搜索引擎优化,很多站长朋友都觉得发发外联就可以了,至少有一部分人是这样认为的. 这里唐建鹏博客将系统的从零开始学习网站优化(Seo),来解析如何从头包装我们的网络门户. 什么是 ...

  10. AC日记——字符环 openjudge 1.7 30

    30:字符环 总时间限制:  1000ms 内存限制:  65536kB 描述 有两个由字符构成的环.请写一个程序,计算这两个字符环上最长连续公共字符串的长度.例如,字符串“ABCEFAGADEGKA ...