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. 初识JNI

    需要用到NDK Android 平台从诞生起,就已经支持 C.C++开发.众所周知,Android 的 SDK 基于 Java 实现,这意味着基于 Android SDK 进行开发的第三方应用都必须使 ...

  2. 用Android Studio 开发Android应用

    目前AndroidStudio已经到了1.2版本了,我用了下,觉得还蛮好的,有些自动生成的资源,它会自动帮你管理.下面开始列一下,我的开发环境搭配.在开始前,你得有个VPN,可者代理.嗯.不然你下不了 ...

  3. cvBox2D和RotatedRect中返回的角度angle详解

    本文为作者原创,未经允许不得转载: 原文由作者发表在博客园: http://www.cnblogs.com/panxiaochun/p/5478555.html 关于cvBox2D和RotatedRe ...

  4. 校园导游系统(C++实现,VC6.0编译,使用EasyX图形库)

    运行效果: 说明: 由于当年还不会使用多线程,所以很多获取用户点击的地方都是使用循环实现的...CPU占用率会比较高. 代码: //校园导游系统.cpp 1 #include <graphics ...

  5. [No00001E]不出国,学口语-出国口语自然好?才怪咧!

  6. Asp.Net MVC中DropDownListFor的用法(转)

    2016.03.04 扩展:如果 view中传入的是List<T>类型 怎么使用 DropList 既然是List<T> 那么我转化成 T  List<T>的第一个 ...

  7. js左右滚动幻灯

    js左右滚动幻灯 点击下载

  8. Windows 8.1 新增控件之 AppBar

    Windows 8.1 与Windows 8 相比已经有了很多改进,从ITPro 角度这篇文章<What's New in Windows 8.1>已经表述的很详细.对开发者来说,最明显的 ...

  9. office2016各个版本 以及 解决visio搜索任何都提示无匹配项问题

    http://tieba.baidu.com/p/4089747196 版本:Office 2016 Visio 专业版 32位版文件名:SW_DVD5_Visio_Pro_2016_W32_ChnS ...

  10. MVC-RedirectToAction跳转到其他Area

    mvc使用Area分区开发后,存在不同Area之间的跳转,需要为每个区间添加Area规则,如下: using System.Web.Mvc; namespace web.Areas.FrameSet ...