/**
*递归分治算法之矩阵链
*@author Sking
*/
package 递归分治;
public class MatrixChainMultiplication {
/**
* 递归分治问题之矩阵链问题
* @param s s[i][j]存放矩阵链[i-j]分开的位置
* @param p 矩阵链维度数组
* @param i 矩阵链左端索引
* @param j 矩阵链有端索引
* @return 最小乘积次数
*/
public static int recurMatrixChain(int[][] s, int[] p, int i, int j) {
if (i == j)
return 0;
int u = recurMatrixChain(s, p, i + 1, j) + p[i - 1] * p[i] * p[j];
s[i][j] = i;
for (int k = i + 1; k < j; k++) {
int t = recurMatrixChain(s, p, i, k)
+ recurMatrixChain(s, p, k + 1, j) + p[i - 1] * p[k] * p[j];
if (t < u) {
u = t;
s[i][j] = k;
}
}
return u;
}
/**
* 根据s数组中保存的信息,打印矩阵链乘积格式
* @param s 存在分开位置的数组
* @param i 左端索引
* @param j 右端索引
*/
public static void traceback(int[][] s, int i, int j) {
if (i == j) {
System.out.print("A" + i + "");
return;
}
if (i != s[i][j])
System.out.print("(");
traceback(s, i, s[i][j]);
if (i != s[i][j])
System.out.print(")");
if (j != s[i][j] + 1)
System.out.print("(");
traceback(s, s[i][j] + 1, j);
if (j != s[i][j] + 1)
System.out.print(")");
}
}
递归分治算法之矩阵链问题(Java版本)
最新推荐文章于 2022-04-10 13:29:44 发布