Pagini recente » infoarena - te ajutam sa devii olimpic! | Monitorul de evaluare | Monitorul de evaluare | infoarena - comunitate informatica, concursuri de programare | Cod sursa (job #2201703)
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();
}
}