下面的代码是对《算法导论》(第二版)第十五章第二节内容的实现。这个算法的时间复杂度是O(n3)(n的3次方)。
下面的网址是网上很常见的一个c++的算法实现: http://blog.csdn.net/ujs_abc/archive/2008/02/01/2076876.aspx
public class MatrixOrder2
{
private static String name = "ABCDEF";
private static int[] a = {30, 35, 15, 5, 10, 20, 25};
private static int len = a.length - 1;
private static int[][] m = new int[len][len];
private static int[][] s = new int[len][len];
public static void main(String[] args)
{
System.out.print("最少需要的计算次数:");
Compute(a, m, s);
System.out.println();
System.out.print("矩阵相乘的顺序为: ");
Display(s, name, 0, len-1);
}
public static void Compute(int[] a, int[][] m, int[][] s)
{
int t = 0;
int min = 0;
int temp = 0;
for(int i=2; i<a.length; i++)
{
for(int j=0; j<a.length-i; j++)
{
t = j + i - 1;
m[j][t] = Integer.MAX_VALUE;
for(int k=j; k<t; k++)
{
temp = m[j][k] + m[k+1][t] + a[j]*a[k+1]*a[t+1];
if(temp < m[j][t])
{
min = temp;
m[j][t] = temp;
s[j][t] = k;
}
}
}
}
System.out.print(min);
}
public static void Display(int[][] s, String name, int i, int j)
{
if(i == j)
{
System.out.print(name.charAt(i));
}
else
{
System.out.print("(");
Display(s, name, i, s[i][j]);
Display(s, name, s[i][j]+1, j);
System.out.print(")");
}
}
}