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. 004.UDP--拼接UDP数据包,构造ip头和udp头通信(使用原始套接字)

    一.大致流程: 建立一个client端,一个server端,自己构建IP头和UDP头,写入数据(hello,world!)后通过原始套接字(SOCK_RAW)将包发出去. server端收到数据后,打 ...

  2. Windows批处理:自动检查网络连通性

    检测网络连通性我用的是丛远到近的方法,即“外网——网关——内网——本机”,脚本的实现也是根据这个顺序用ping来检测,为提高检测速度,这里我只ping了2次,各位可以根据自己的需要进行修改. 使用方法 ...

  3. MiniProfiler 兼容 Entity Framework 6

    一直以来都是在用MiniProfiler配合ASP.NET MVC做请求的监控. 在某项目升级Entity Framework 6之后,在执行查询时报错误: --------------无法将类型为“ ...

  4. 开发Eclipse自定义控件

    摘自:http://www.ibm.com/developerworks/cn/opensource/os-eclipcntl/ 我们在开发自定义控件时主要考虑以下问题: 1. 自定义控件的绘制:通常 ...

  5. plain framework 1 pak插件说明(资源压缩加密)

    在互联网的发展中,资源的整理一般成了发布软件应用的迫在眉睫的一件事情,不经打包的资源往往容易暴露而且众多的文件使得拷贝等待时间变长.在这种情况下,一种应用便诞生了,其起源是源自压缩软件,这便是我们今天 ...

  6. cuda中thread id

    //////////////////////////////////////////////////////////////////////////// // // Copyright 1993-20 ...

  7. UVALive 5066 Fire Drill --BFS+DP

    题意:有一个三维的地图,有n个人被困住,现在消防队员只能从1楼的一个入口进入,营救被困者,每一个被困者有一个价值,当消防队员找到一个被困者之后,他可以营救或者见死不救,如果救的话,他必须马上将其背到入 ...

  8. Eclipse启动时布局不合理调整

    1. 关掉 启动页 2. 关掉InstSearch页 3.修正InSearch布局 3.1 默认InstSearch不合理,影响使用. 3.2 Inst 搜索一次,然后最小化InstSearch框,再 ...

  9. uva131 The Psychic Poker Player

    The Psychic Poker Player Time Limit: 3000MS     64bit IO Format: %lld & %llu Description In 5-ca ...

  10. Oracle round函数是什么意思?怎么运用?

    如何使用 Oracle Round 函数 (四舍五入) 描述 : 传回一个数值,该数值是按照指定的小数位元数进行四舍五入运算的结果. SELECT ROUND( number, [ decimal_p ...