2
ダイナミックプログラミングでマトリックスチェインの乗算について読んでいた これは指数関数的な実行時間を持つ素朴な再帰的な解を持っています。動的プログラミング行列チェーンの乗算
http://www.geeksforgeeks.org/dynamic-programming-set-8-matrix-chain-multiplication/
ダイナミックprogがありますが。実行時の複雑さがO(n^3)のソリューション(上のリンクのコード)ですが、重複するサブ問題の結果を格納する2次元配列を保持すると、dp解と同じ実行時間?
public class MatrixChain {
public static void main(String... args) throws IOException {
new MatrixChain().job();
}
private void job() {
int arr[] = new int[]{40, 20, 30, 10, 30};
int[][] dp = new int[5][5];
for (int[] x : dp)
Arrays.fill(x, -1);
int min = findMin(arr, 1, arr.length - 1, dp);
System.out.println(min);
}
private int findMin(int[] arr, int i, int j, int dp[][]) {
if (i == j) return 0;
int min = Integer.MAX_VALUE;
for (int k = i; k < j; k++) {
int fp;
if (dp[i][k] == -1)
dp[i][k] = fp = findMin(arr, i, k, dp);
else fp = dp[i][k];
int lp;
if (dp[k + 1][j] == -1)
dp[k + 1][j] = lp = findMin(arr, k + 1, j, dp);
else
lp = dp[k + 1][j];
int sum = fp + lp + arr[i - 1] * arr[k] * arr[j];
if (sum < min)
min = sum;
}
return min;
}
}
ありがとう!
デュードを、 'geeksforgeeks'は非常に高品質のブログです。そこに配置されているコードのすべての行を信頼することができます! – xenteros