1. 程式人生 > >[藍橋杯][演算法提高VIP]和最大子序列 (Java版)

[藍橋杯][演算法提高VIP]和最大子序列 (Java版)

題目:對於一個給定的長度為N的整數序列A,它的“子序列”的定義是:A中非空的一段連續的元素(整數)。你要完成的任務是,在所有可能的子序列中,找到一個子序列,該子序列中所有元素的和是最大的(跟其他所有子序列相比)。程式要求你輸出這個最大值。

我們的校賽選了這道題,一開始我一看題,很高興,發現就是個簡單的模版題,結果提交後瘋狂報re,百度也發現有人說這題的測試資料有問題,終於被我發現哪裡有問題了。
解題思路:
一個簡單的最大欄位和模版題,邊讀入邊判斷,用一個sum來儲存前一段區間的和,如果sum大於max,就把sum賦值給max,max的初值根據題目資料的範圍設定為-10001,如果sum小於0就把sum設為0.思路沒有問題,就是測試資料出錯了。
注意事項:
這道題的測試資料出錯了,Java讀不了這個資料,c語言能讀這種資料,但是Java會報執行時錯誤,特意用字串讀取才發現報的錯誤是什麼,之前直接用sc.nextInt讀取報了輸入字元不匹配

在這裡插入圖片描述

import java.util.Scanner;

//Java的測試資料出錯了。。

public class 和最大子序列 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int sum=0;
		int max=-10001;
	    int a;    	    
		for(int i=0;i<n;i++){
			a=Integer.parseInt(sc.next());	//特意用字串讀取才發現報的錯誤是什麼,之前直接用sc.nextInt讀取報了輸入字元不匹配		
			sum+=a;
			if(sum>max)
				max=sum;
			if(sum<0)
				sum=0;
		}		
		System.out.println(max);		
		sc.close();
	}
}