Cod sursa(job #1618092)

Utilizator andrei.mardaleAndrei Mardale andrei.mardale Data 27 februarie 2016 18:12:21
Problema Subsecventa de suma maxima Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 1.34 kb
package ssm;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;


public class Main {

	private int [] v;
	int n;
	
	private void readData() {
		Scanner reader = null;
		try {
			reader = new Scanner (new FileInputStream("ssm.in"));
			n = reader.nextInt();
			v = new int[n];
			for (int i = 0; i < n-1; i++){
				v[i] = reader.nextInt();
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		finally {
			reader.close();
		}
		
	}
	
	public int maxSum (int st, int en) {
		if (st == en){
			return v[st];
		}
			
		int m = st + (en - st) / 2;
		
		int maxLeft = maxSum (st, m);
		int maxRight = maxSum (m+1, en);
		
		int leftBorderSum = 0, maxLeftBorderSum = Integer.MIN_VALUE;
		
		for (int i = m; i >= st; i--) {
			leftBorderSum += v[i];
			if (leftBorderSum > maxLeftBorderSum)
				maxLeftBorderSum = leftBorderSum;
		}
		
		int rightBorderSum = 0, maxRightBorderSum = Integer.MIN_VALUE;
		for (int i = m+1; i <= en; i++){
			rightBorderSum += v[i];
			if (rightBorderSum > maxRightBorderSum)
				maxRightBorderSum = rightBorderSum;
		}
		
		int maxMid = maxLeftBorderSum + maxRightBorderSum;
		
		return Math.max(maxMid, Math.max(maxRight, maxLeft));
		
	}
	
	public static void main(String[] args) {
		Main m = new Main();
		m.readData();
		System.out.println(m.maxSum(0, m.v.length - 1));

	}

}