poj2479 && poj2593Maximum sum(求两个不相交最大字段的和)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents

题目链接:http://poj.org/problem?id=2479

Description

Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below:

Your task is to calculate d(A).

Input

The input consists of T(<=30) test cases. The number of test cases (T) is given in the first line of the input.

Each test case contains two lines. The first line is an integer n(2<=n<=50000). The second line contains n integers: a1, a2, ..., an. (|ai| <= 10000).There is an empty line after each case.

Output

Print exactly one line for each test case. The line should contain the integer d(A).

Sample Input

1

10
1 -1 2 2 3 -3 4 -4 5 -5

Sample Output

13

Hint

In the sample, we choose {2,2,3,-3,4} and {5}, then we can get the answer.

Huge input,scanf is recommended.

Source

POJ Contest,Author:[email protected]

代码如下:

#include <cstdio>
#include <iostream>
using namespace std;
#define INF 0x3fffffff
#define M 100000+17
int a[M],b[M];
int main()
{
	int n, i, T;
	while(~scanf("%d",&T))
	{
		while(T--)
		{
			scanf("%d",&n);
			int sum = 0, MAX = -INF;
			for(i = 1; i <= n; i++)
			{
				scanf("%d",&a[i]);
				sum+=a[i];
				if(sum > MAX)
				{
					MAX = sum;
				}
				b[i] = MAX;
				if(sum < 0)
				{
					sum = 0;
				}
			}
			MAX = -INF;
			sum = 0;
			int ans = MAX, t;
			for(i = n; i > 1; i--)
			{
				sum+=a[i];
				if(sum > MAX)
				{
					MAX = sum;
				}
				t = MAX + b[i-1];
				if(t > ans)
				{
					ans = t;
				}
				if(sum < 0)
				{
					sum = 0;
				}
			}
			printf("%d\n",ans);
		}
	}
	return 0;
}

poj2479 && poj2593Maximum sum(求两个不相交最大字段的和)

时间: 2024-10-07 02:37:26

poj2479 && poj2593Maximum sum(求两个不相交最大字段的和)的相关文章

poj2593 Max Sequence(求两个不相交最大字段和)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=2593 Description Give you N integers a1, a2 ... aN (|ai| <=1000, 1 <= i <= N). You should output S. Input The input will consist of several test cases. For e

【原题】求两个不相交的连续子数组的最大和

题目: 有一个整数数组n,a和b是n里两个互不相交的子数组.返回sum(a)+sum(b)的最大值. 分析: 新建两个数组left和right,left[i]表示n[0:i]的连续子数组的最大和,right[i]表示n[i:length-1]的连续子数组的最大和.left[i]+right[i+1]的最大值就是答案. int SumOfTwoSubarray(const vector<int> &n) { if (n.size() < 2) { throw exception()

【leetcode74】Sum of Two Integers(不用+,-求两数之和)

题目描述: 不用+,-求两个数的和 原文描述: Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Example: Given a = 1 and b = 2, return 3. 方法一:用位运算模拟加法 思路1: 异或又被称其为"模2加法" 设置变量recipe模拟进位数字,模拟加法的实现过程 代码: public class Solutio

POJ2479 Maximum sum[DP|最大子段和]

Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 39599   Accepted: 12370 Description Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below: Your task is to calculate d(A). Input The input consists o

求两数最小公倍数

输入代码: /* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:sum123.cpp * 作 者:林海云 * 完成日期:2015年1月10日 * 版 本 号:v2.0 * * 问题描述:求两数的最小公倍数 * 输入描述:两个整数 * 程序输出:最小公倍数 */ #include<iostream> using namespace std; int gcd(int x,int y); int gad(int x,int

编程题:求两数之和

#include<stdio.h>       /*包含输入输出头文件*/ main()                            /*定义主函数*/ {  int a,b,sum;                /*定义整数变量a.b.sum*/ a=123;                        /*给a赋值*/ b=456;                        /*给b赋值*/ sum=a+b;                  /*令sum=a+b*/ p

求两个对角向上、列索引是偶数的元件和。

//求两个对角向上.列索引是偶数的元件和. #include <stdio.h> int main() { int sum=0; int i,j; int a[5][5]; //为数组赋值 for(i=0;i<5;i++) { for(j=0;j<5;j++) { scanf("%d",&a[i][j]); } } //求两条对角线上行.列下标均为偶数的各元素之和. for(i=0;i<5;i++) { for(j=0;j<5;j++) {

12_1求两个整数中的较小值,要求不能使用比较运算符, if-else, a&gt;b?a:b, while for

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4253932.html  声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:求两个整数中的较小值,要求不能使用比较运算符, if-else, a>b?a:b, while for, 内嵌汇编递归第三方函数. 在网上看到一些网友给出了

求两条对角线上行、列下标均为偶数的各元素之和。

//求两条对角线上行.列下标均为偶数的各元素之和. #include <stdio.h> int main() { int sum=0; int i,j; int a[5][5]; //为数组赋值 for(i=0;i<5;i++) { for(j=0;j<5;j++) { scanf("%d",&a[i][j]); } } //求两条对角线上行.列下标均为偶数的各元素之和. for(i=0;i<5;i++) { for(j=0;j<5;j++