1914 - 最大连续和
时间限制 : 5 秒
内存限制 : 128 MB
给定一列数字A1,A2,A3...,An。求序列中一段连续的数字,使得它们的和最大。保证数字个数N≤1000,|Ai|≤10000。
题目输入
对于每组数据,第一行是正整数N,描述数字的个数。第二行有N个数字,按一定的顺序给出。输入以N=0结束。
题目输出
对于每组数据,输出最大连续和。
输入/输出样例
输入格式
3 -1 1 0 5 1 2 3 4 -5 0
输出格式
1 10
C++解答
#include <iostream> using namespace std; int b[1005], a[1005]; const int INF = 1000000000; int main(){ int n, MAX; while(cin >> n && n){ b[0] = 0; MAX = -INF; for(int i = 1; i <= n; ++i){ cin >> a[i]; b[i] = a[i]+b[i-1]; } for(int i = 0; i < n; ++i) for(int j = i+1; j <= n; ++j) if(b[j]-b[i] > MAX) MAX = b[j]-b[i]; cout << MAX << endl; } return 0; }
Java解答
import java.util.Scanner; public class Main{ public static void main(String args[]){ Scanner in=new Scanner(System.in); while(in.hasNext()){ int n=in.nextInt(); if(n==0) break; int a[]=new int[n]; for(int i=0;i<n;i++){ a[i]=in.nextInt(); } int sum=a[0]; for(int i=0;i<n;i++){ if(a[i]>sum) sum=a[i]; } for(int i=0;i<n;i++){ for(int j=n-1;j>i;j--){ int add=a[i]; for(int k=i;k<j;k++){ add+=a[k+1]; if(add>=sum) sum=add; } } } System.out.println(sum); } } }