hdu1003 最大连续子序和

Description

Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14.

Input

The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line starts with a number N(1<=N<=100000), then N integers followed(all the integers are between -1000 and 1000).

Output

For each test case, you should output two lines. The first line is "Case #:", # means the number of the test case. The second line contains three integers, the Max Sum in the sequence, the start position of the sub-sequence, the end position of the sub-sequence. If there are more than one result, output the first one. Output a blank line between two cases.

Sample Input

2

5 6 -1 5 4 -7

7 0 6 -1 1 -6 7 -5

Sample Output

Case 1: 14 1 4

Case 2: 7 1 6

用变量记录开头和结尾,然后从第一个不断累加到最后一个

在途中,不断更新和维护【最大连续子序和】和他的开头和结尾的下表,

如果临时的连续子序和小于零 就赋0 再累加下去。。。

#include<iostream>
#include<algorithm>
using namespace std;
class M{
public:
    int a,b,sum;
};
int x[100002];
int main(){
    int t;cin>>t;
    for(int k=1;k<=t;k++){
        if(k!=1)cout<<endl;
        int n;cin>>n;
        M t; t.a=1; t.b=1;  t.sum=-1000;
        int ta=1; int sum=0;
        for(int i=1;i<=n;i++){
            cin>>x[i];
            sum+=x[i];
            if(sum>t.sum){
                t.a=ta;
                t.b=i;
                t.sum=sum;
            }
            if(sum<0){
                sum=0;
                ta=i+1;
            }
        }
        cout<<"Case "<<k<<":"<<endl;
        cout<<t.sum<<" "<<t.a<<" "<<t.b<<endl;
    }
return 0;
}

时间: 2024-09-27 21:49:33

hdu1003 最大连续子序和的相关文章

hdu1003 最大连续子列和(动态规划★★★☆☆)

解题思路: 利用动态规划方法求解最大子列和,对应输入数据a[i],会有数据dp[i].数组dp中的每个元素dp[i],表示以a[i]结尾的最大连续子列和.遍历dp数组,可以找出子列和最大值. if (dp[i-1] >=0){ dp[i] = dp[i-1] + a[i]; } else{ dp[i] = a[i] } #include <iostream> #include <stdio.h> #include <stdlib.h> using namespac

HDU 1003 Max Sum (最大连续子序和)

Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 156637    Accepted Submission(s): 36628 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max su

C++中求数组连续子向量的最大和(牛客剑指offer)

/////////////////////////////////////////////////////////////////// //HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学. //今天测试组开完会后,他又发话了:在古老的一维模式识别中, //常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决. //但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢? //例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开

求最大和连续子向量问题的算法分析

1 问题描述 这是从<编程珠玑(第 2 版)>的第 8 章"算法设计技术"中看到的一个问题.问题的描述是这样的, "问题的输入是具有 n 个浮点数的向量 x,输出是输入向量的任何连续子向量中的最大和.例如,如果输入向量包含下面 10个元素:(31,-41,59,26,-53,97,-93,-23,84) 那么该程序的输出为x[2...6] 的总和,即 187." 当所有的数都是正数时,问题很容易解决,此时最大的子向量就是输入向量本身.但如果输入向量中含有

[LeetCode] Shortest Unsorted Continuous Subarray 最短无序连续子数组

Given an integer array, you need to find one continuous subarray that if you only sort this subarray in ascending order, then the whole array will be sorted in ascending order, too. You need to find the shortest such subarray and output its length. E

一维向量中连续子向量的最大和

Q:一个一维向量:arr[n] = {i1,i2,i3,......,in} ,计算其连续子向量中最大和.(即截取连续的一段使得段中各元素和最大,元素有负值:子向量可以为空,即和最小为0) A: 最初的想法是穷举,双层循环将所有连续的元素和算出来 for [i,n){ for[j,n){ caculate sum(arr[j],arr[j]); } } 这种方式虽然有效,但显得很蠢. 这里假设截取的区间是 arr[start, end] ,那么arr[start, end+1]的连续子向量的最大

查找环形数组的和最大的连续子数组

设计思想: 把一个数组连成环,查找这个环的和最大的连续子数组时走到原来的数组尾部可以再继续加第一个元素,所以等价于构建一个原来数组2倍的数组 查找和最大的连续子数组方法: 设原先数组两倍的数组名为a,长度为2n - 1,原数组长度为n 定义一个当前的总和currectSum,初始值为a[0];定义一个当前总和的开始加和的位置下标currectStartIndex,初始值为0:定义一个记录连续加了多少个数的变量count,初始值为1.定义一个长度为3的结果数组result,用来存放最终找到的和最大

算法 | 最大连续子数组

最大连续子数组 给定一个数组A[0,1,-,n-1],求A的连续子数组,使得该子数组的和最大. 例如: 数组:1,-2,3,10,-4,7,2,-5 最大字数组:3,10,-4,7,2 此问题有以下四种方法 1.  暴力法 2.  分治法 3.  分析法 4.  动态规划法 暴力法 直接求解A[I,-j]的值,其中,0<=i<n,i<=j<n,因为i,i+1,-j的最大长度为n,所以时间复杂度O(n3). //暴力法 int MaxSubArray(int *a, int n) {

查找数组连成环形的和最大的连续子数组

1 package zuoYe; 2 3 import java.util.Scanner; 4 5 6 public class MaxSubArray { 7 public static void main(String[] args) { 8 Scanner scan = new Scanner(System.in); 9 10 11 //输入数据 12 System.out.println("请输入数组长度"); 13 int n = scan.nextInt(); 14 in