1077_最大序列和

//// 1077最大序列和.cpp : 定义控制台应用程序的入口点。
//题目1077:最大序列和
//时间限制:1 秒内存限制:32 兆特殊判题:否提交:6283解决:1875
//题目描述:
//给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的“序列和”。
//对于S的所有非空连续子序列T,求最大的序列和。
//变量条件:N为正整数,N≤1000000,结果序列和在范围(-2^63,2^63-1)以内。
//
//输入:
//第一行为一个正整数N,第二行为N个整数,表示序列中的数。
//输出:
//输入可能包括多组数据,对于每一组输入数据,
//仅输出一个数,表示最大序列和。
//样例输入:
//5
//1 5 -3 2 4
//
//6
//1 -2 3 4 -10 6
//
//4
//-3 -1 -2 -5
//样例输出:
//9
//7
//-1
//来源:
//2006年清华大学计算机研究生机试真题

#include "stdafx.h"
#include "iostream"
#include "stdio.h"
#include "algorithm"
#include "limits.h"
using namespace std;

#define MAX(x,y) x>y?x:y

int main()
{
    int n;
    while(~scanf("%d",&n)){
        long long x;
        long long max_sum = LONG_MIN;
        long long sub_sum = 0;           
        for(int k = 0;k<n;k++){
            cin>>x;
            sub_sum = MAX(sub_sum+x,x);   //实际上是判断原来的 包含上一个数 的最大子串和是不是大于0
            max_sum = MAX(max_sum,sub_sum);
        }
        cout<<max_sum<<endl;
    }
    return 0;
}

/*

1.由于N比较大,所以定义数组来存储的话太占内存,直接读入一个处理一个
2.LONG_MIN的头文件"limits.h"
3.x若定义为int而不是long long则 WA

*/


//#define MAX 100010
//int a[MAX];
//int dp[MAX];
//
//int main()
//{
//  int n;
//  while(~scanf("%d",&n)){
//      
//      for(int k = 0;k<n;k++)
//          cin>>a[k];
//      int max_sum = a[0];     
//      dp[0] = a[0];
//      for(int i = 1; i<n; i++){
//          dp[i] = max(dp[i-1]+a[i],a[i]);
//          max_sum = max(max_sum,dp[i]);
//      }
//      cout<<max_sum<<endl;
//  }
//  return 0;
//}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值