java實現矩陣連乘的動態規划


package com.cjs.algorithm;

public class DynamicPlan {

    /**
     * 此方法用來求解矩陣連乘的最小數乘次數
     * 
     * @param p
     *            傳入的要連乘的矩陣的維數信息的數組
     * @return String型的矩陣的最小數層次數信息
     */
    public static String matrixChain(int p[]) {

        int n = p.length - 1;  //為p的實際最大下標
        int m[][] = new int[n + 1][n + 1];
        int s[][] = new int[n + 1][n + 1];

        for (int i = 1; i <= n; i++) {
            m[i][i] = 0;
        }
        for (int r = 2; r <= n; r++) // r為當前計算的鏈長(子問題規模)
        {
            for (int i = 1; i <= n - r + 1; i++)// n-r+1為最后一個r鏈的前邊界
            {
                int j = i + r - 1;// 計算前邊界為r,鏈長為r的鏈的后邊界

                m[i][j] = m[i + 1][j] + p[i - 1] * p[i] * p[j];// 將鏈ij划分為A(i) *( A[i+1:j] )
                s[i][j] = i;

                for (int k = i + 1; k < j; k++) {
                    // 將鏈ij划分為( A[i:k] )* (A[k+1:j])
                    int t = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
                    if (t < m[i][j]) {
                        m[i][j] = t;
                        s[i][j] = k;
                    }
                }
            }
        }

        String answer = "";
        answer = answer + "此矩陣連乘所需的最小次數為:" + m[1][n] + "\n";
        matrixTraceBack(1, n, s);

        return answer;

    }

    private static void matrixTraceBack(int i, int j, int s[][]) {

        if (i == j) {
            return;
        }
        matrixTraceBack(i, s[i][j], s);
        matrixTraceBack(s[i][j] + 1, j, s);

        int x = s[i][j] + 1;
        System.out.print("Multipy A" + i + "," + s[i][j]);
        System.out.println(" and A" + x + "," + j);

    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM