public MultsAndOptimalCosts MatrixChainOrder() { int n = dimensions.Length - 1; MultsAndOptimalCosts result = new MultsAndOptimalCosts() { Mults = new int[n, n], OptimalCosts = new int[n, n] }; for (int l = 1; l < n; l++) { for (int i = 0; i < n - l; i++) { int j = i + l; result.Mults[i, j] = int.MaxValue; for (int k = i; k < j; k++) { int candidateMin = result.Mults[i, k] + result.Mults[k + 1, j] + dimensions[i] * dimensions[k + 1] * dimensions[j + 1]; if (candidateMin < result.Mults[i, j]) { result.Mults[i, j] = candidateMin; result.OptimalCosts[i, j] = k; } } } } //for (int l = 2; l <= n; l++) //{ // for (int i = 1; i <= n - l + 1; i++) // { // int j = i + l - 1; // result.Mults[i, j] = int.MaxValue; // for (int k = i; k <= j - 1; k++) // { // int minMult = result.Mults[i, k] + result.Mults[k + 1, j] // + dimensions[i - 1] * dimensions[k] * dimensions[j]; // if (minMult < result.Mults[i, j]) // { // result.Mults[i, j] = minMult; // result.OptimalCosts[i, j] = k; // } // } // } //} return(result); }
public MultsAndOptimalCosts MatrixChainOrder() { int n = dimensions.Length - 1; MultsAndOptimalCosts result = new MultsAndOptimalCosts() { Mults = new int[n, n], OptimalCosts = new int[n, n] }; for (int l = 1; l < n; l++) { for (int i = 0; i < n - l; i++) { int j = i + l; result.Mults[i, j] = int.MaxValue; for (int k = i; k < j; k++) { int candidateMin = result.Mults[i, k] + result.Mults[k + 1, j] + dimensions[i] * dimensions[k + 1] * dimensions[j + 1]; if (candidateMin < result.Mults[i, j]) { result.Mults[i, j] = candidateMin; result.OptimalCosts[i, j] = k; } } } } //for (int l = 2; l <= n; l++) //{ // for (int i = 1; i <= n - l + 1; i++) // { // int j = i + l - 1; // result.Mults[i, j] = int.MaxValue; // for (int k = i; k <= j - 1; k++) // { // int minMult = result.Mults[i, k] + result.Mults[k + 1, j] // + dimensions[i - 1] * dimensions[k] * dimensions[j]; // if (minMult < result.Mults[i, j]) // { // result.Mults[i, j] = minMult; // result.OptimalCosts[i, j] = k; // } // } // } //} return result; }