Cod sursa(job #2201703)

Utilizator silviucostinMiron Silviu Costin silviucostin Data 5 mai 2018 16:18:56
Problema Parantezare optima de matrici Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 1.68 kb
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;

public class Main {
	static class Task {
		public static final String INPUT_FILE = "in";
		public static final String OUTPUT_FILE = "out";
		public static final int NMAX = 105;

		int n;
		int d[];

		private void readInput() {
			try {
				Scanner sc = new Scanner(new BufferedReader(new FileReader(
								INPUT_FILE)));
				n = sc.nextInt();
				d = new int[n + 1];
				for (int i = 0; i <= n; i++) {
					d[i] = sc.nextInt();
				}
				sc.close();
			} catch (IOException e) {
				throw new RuntimeException(e);
			}
		}

		private void writeOutput(Integer result) {
			try {
				PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(
						OUTPUT_FILE)));
				pw.printf("%d", result);
				pw.close();
			} catch (IOException e) {
				throw new RuntimeException(e);
			}
		}

		private Integer getResult() {
			int m[][] = new int[n + 1][n + 1];
			//int s[][] = new int[n + 1][n + 1];

			for (int i = 1; i < n; i++) {
				m[i][i] = 0;
				m[i][i + 1] = d[i - 1] * d[i] * d[i + 1];
			}
			m[n][n] = 0;
			for (int l = 2; l < n; l++) {
				for (int i = 1; i <= n - l; i++) {
					m[i][i + l] = 100000000;
					for (int k = 1; k < i + l; k++) {
						if (m[i][k] + m[k + 1][i + l] + d[i - 1] * d[k] * d[i + l] < m[i][i + l]) {
							m[i][i + l] = m[i][k] + m[k + 1][i + l] + d[i - 1] * d[k] * d[i + l];
						}
					}
				}
			}
			return m[1][n];
		}

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

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