/*
* UVa 348 - Optimal Array Multiplication Sequence
* */
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n;
int count = 0;
Main mm = new Main();
while ((n = scanner.nextInt()) > 0) {
count ++;
int[] p = new int[n + 1];
for (int i = 0; i < n - 1; i++) {
p[i] = scanner.nextInt();
scanner.next();
}
p[n - 1] = scanner.nextInt();
p[n] = scanner.nextInt();
int[][] s = new int[n + 1][n + 1];// 存放分割点
int[][] m = new int[n + 1][n + 1];// 存放代价
mm.matrix_chain(p, m, s);
System.out.print("Case " + count + ": ");
mm.print(s, 1, n);
System.out.println();
}
}
private void matrix_chain(int[] p, int[][] m, int[][] s) {
int i, j;
int n = p.length - 1;// 矩阵链长度
for (i = 1; i <= n; i++)
m[i][i] = 0;// 初始化长度为1的链代价
for (int l = 2; l <= n; l++) {// 矩阵链长度依次增加
for (i = 1; i <= n - l + 1; i++) {// i,j的位置在变化 保证长度是l
j = i + l - 1;
m[i][j] = Integer.MAX_VALUE;// 初始化m[i][j]
for (int k = i; k <= j - 1; k++) {// k的位置可以从i变化到j-1
int q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
if (q < m[i][j]) {
m[i][j] = q;
s[i][j] = k;// 记录最优k值
}
}
}
}
}
private void print(int[][] s, int i, int j) {
if (i == j)
System.out.print("A" + i);
else {
System.out.print("(");
print(s, i, s[i][j]);
System.out.print(" x ");
print(s, s[i][j] + 1, j);
System.out.print(")");
}
}
}
UVa 348 - Optimal Array Multiplication Sequence
最新推荐文章于 2017-06-04 18:48:00 发布