Cod sursa(job #3345483)

Utilizator andreipopa11Popa Andrei andreipopa11 Data 9 martie 2026 19:25:37
Problema Subsecventa de suma maxima Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 2.49 kb
import java.io.*;
import java.util.ArrayList;

public class SSM {
    static class Task{
        private int length;
        private final ArrayList<Integer> numbers = new ArrayList<>();

        static class Ssm{
            private final int sum;
            private final int startIdx;
            private final int stopIdx;
            public Ssm(int sum, int startIdx, int stopIdx){
                this.sum = sum;
                this.startIdx = startIdx;
                this.stopIdx = stopIdx;
            }
        }

        private void read() {
            try {
                BufferedReader bufferedReader = new BufferedReader(new FileReader("src/ssm.in"));

                length = Integer.parseInt(bufferedReader.readLine());

                String line = bufferedReader.readLine();
                String[] aux = line.split(" ");

                for (String s : aux) {
                    numbers.add(Integer.parseInt(s));
                }

                bufferedReader.close();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }

        private void write(Ssm ssm) throws IOException {
            try {
                BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("src/ssm.out"));

                String toWrite = ssm.sum + " " + ssm.startIdx + " " + ssm.stopIdx;
                bufferedWriter.write(toWrite);
                bufferedWriter.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

        public Ssm getResult() {
            return SsmSolve();
        }

        public void solve() throws IOException {
            read();
            write(getResult());
        }

        private Ssm SsmSolve() {
            ArrayList<Integer> dp = new ArrayList<>();
            int sum = 0;
            int startIdx = 0;
            int stopIdx = 0;

            dp.add(numbers.getFirst());

            for (int i = 1; i < length; i++) {
                if (dp.get(i - 1) >= 0) {
                    dp.add(dp.get(i - 1) + numbers.get(i));
                    stopIdx = i;
                    if (dp.get(i) > sum) {
                        sum = dp.get(i);
                    }
                } else {
                    dp.add(numbers.get(i));
                    startIdx = i + 1;
                }
            }

            return new Ssm(sum, startIdx, stopIdx);
        }
    }
}