Cod sursa(job #3292656)

Utilizator eulerdaAna Ana eulerda Data 8 aprilie 2025 22:00:35
Problema Subsecventa de suma maxima Scor 65
Compilator java Status done
Runda Arhiva educationala Marime 1.65 kb
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
	public final static String INPUT_FILE = "ssm.in";
	public final static String OUTPUT_FILE = "ssm.out";

	static class Task {
		int n;
		int[] s;

		public void solve() throws FileNotFoundException {
			readInput();
			writeOutput(getResult());
		}

		private void readInput() throws FileNotFoundException {
			var sc = new Scanner(new FileReader(INPUT_FILE));

			n = sc.nextInt();
			s = new int[n];
			for (int i = 0; i < n; i++) {
				s[i] = sc.nextInt();
			}
			sc.close();
		}

		private void writeOutput(ArrayList<Integer> result) throws FileNotFoundException {
			try (var out = new PrintStream(OUTPUT_FILE)) {
				for (int i = 0; i < result.size(); i++)
					out.print(result.get(i) + " ");
			}
		}

		private ArrayList<Integer> getResult() {
			int[] dp = new int[n + 1];

			int elemMax = s[0], idMax = 0;
			dp[0] = s[0]; // primul element trebuie sa fie el insusi

			for (int i = 1; i < n; i++) {
				dp[i] = Math.max(s[i], dp[i - 1] + s[i]);
				if (dp[i] > elemMax) {
					elemMax = dp[i];
					idMax = i;
				}
			}

			ArrayList<Integer> result = new ArrayList<>();
			result.add(elemMax);
			for (int i = idMax; i >= 0; i--) {
				if (s[i] == dp[i]) {
					result.add(i + 1);
					break;
				}
			}
			result.add(idMax + 1);
//			for (int i = idMax; i >= 0; i--) {
//				if (s[i] != dp[i])
//					result.add(0, s[i]);
//				else {
//					result.add(0, s[i]);
//					break;
//				}
//			}
			return result;

		}

	}
	public static void main(String[] args) throws IOException {
		new Task().solve();
	}
}