Cod sursa(job #1527252)

Utilizator cmvoicuCiprian Voicu cmvoicu Data 17 noiembrie 2015 22:40:36
Problema Subsir crescator maximal Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 2.23 kb
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;

/**
 * Created by Ciprian on 16.11.2015.
 */
public class DynamicProgramming {


    public static void main(String[] args) throws FileNotFoundException {
        Sir sir = new Sir("scmax.in");
        sir.DP(0);
        sir.printSubsir("scmax.out");

    }

    static class Sir {
        int[] sir;
        //max lenght of the subsequence that starts with field at index i
        int[] memo;
        int[] next;

        public Sir(String filename) throws FileNotFoundException {
            Scanner reader = new Scanner(new FileInputStream(filename));
            int n = reader.nextInt();
            this.sir = new int[n];
            for (int i = 0; i < n; i++) {
                sir[i] = reader.nextInt();
            }
            reader.close();
            this.memo = new int[sir.length];
            this.next = new int[sir.length];
        }

        //max lenght of a subsir when s[i] is the first element
        public int DP(int i) {
            if (memo[i] != 0) return memo[i];
            if (i == sir.length - 1) return 1;
            int max = 0;
            for (int j = i + 1; j < sir.length; j++) {
                int dpj = DP(j);
                if (sir[i] < sir[j] && (max < dpj)) {
                    max = dpj;
                    next[i] = j;
                }
            }
            memo[i] = 1 + max;
            return memo[i];
        }

        public void printSubsir(String filename) throws FileNotFoundException {
            int max = 0;
            for (int i = 1; i < memo.length; i++) {
                if (memo[max] < memo[i]) {
                    max = i;
                }
            }
            int length = memo[max];
            int current = max;
            PrintWriter writer = new PrintWriter(filename);
            writer.write(String.valueOf(length) + "\n");
            do {
                writer.write(String.valueOf(sir[current] + " "));
                current = next[current];
                length--;
            } while (length > 0);
            writer.close();
        }
    }
}