1. 程式人生 > 其它 >矩陣鏈乘法

矩陣鏈乘法

矩陣鏈乘法

1.問題

設A1,A2,A3,…,An為 n 個矩陣的序列,其中Ai為Pi-1*Pi階矩陣,這個矩陣鏈的輸入用向量P=<P0,P1,…,Pn>給出。
給定向量 P,確定一種乘法次序,使得基本運算的總次數達到最小。

2.解析

蠻力法

列舉所有可能的乘法次序,針對每種次序計算基本運算的次數,從中找出具有最小運算次數的乘法次序,每一種乘法次序對應了一種 在n個項中加n-1對括號。

動態規劃法

Ai..j表示矩陣鏈相乘的子問題AiAi+1...Aj;

m[i..j] 表示得到乘積Ai..j所用的最少基本運算次數;

滿足優化原則,即m[i,j]最小值時,m[i,k]和m[k+1,j]也是最小的。

例項:P=<30,35,15,25,10,5>,n=5

A1=30*35

A2=35*15

A3=15*25

A4=25*10

A5=10*5

(1)r=1

m[1,1]=0

m[2,2]=0

m[3,3]=0

m[4,4]=0

m[5,5]=0

(2)r=2,i=1,2,3,4 ;j=2,3,4,5

m[1,2]=303515=15750

m[2,3]=351525=13125

m[3,4]=152510=3750

m[4,5]=25105=1250

(3)r=3,i=1,2,3 ;j=3,4,5

m[1,3]=min{m[1,2]+m[3,3]+(A1A2)A3, m[1,1]+ m[2,3]+A1(A2A3)}

m[2,4]=min{m[2,3]+m[4,4]+(A2A3)A4, m[2,2]+ m[3,4]+A2(A3A4)}

m[3,5]=min{m[3,4]+m[5,5]+(A3A4)A5, m[3,3]+ m[4,5]+A1(A2A3)}

(4)r=4,i=1,2 ;j=4,5

m[1,4]=min{ m[1,1]+ m[2,4]+A1(A2A3A4), m[1,2]+ m[3,4]+(A1A2)(A3A4),m[1,3]+ m[4,4]+(A1A2A3)A4};

m[2,5]=min{ m[2,2]+ m[3,5]+A2(A3A4A5), m[2,3]+ m[4,5]+(A2A3)(A4A5),m[2,4]+ m[5,5]+(A2A3A4)A5};

(5)r=5,i=1 ;j=5

m[1,5]=min{m[1,1]+m[2,5]+A1(A2A3A4A5),m[1,2]+m[3,5]+(A1A2)(A3A4A5),m[1,3]+m[4,5]+(A1A2A3)(A4A5),m[1,4]+ m[5,5]+ (A1A2A3A4)A5};

3.設計

第K小問題

    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        n = scan.nextInt();
        for (int i = 0; i <= n; i++)
        {
            p[i] = scan.nextInt();
            m[i][i] = 0;
        }
 
        for (int l = 2; l <= n; l++)
        {
            for (int i = 1; i <= n - l + 1; i++)
            {
                int j = i + l - 1;
                m[i][j] = MAX;
                for (int k = i; k <= j - 1; k++)
                {
                    int q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
                    if (q < m[i][j])
                    {
                        m[i][j] = q;
                        s[i][j] = k;
                    }
                }
            }
        }
        print(1, n);
        System.out.printf(" %d\n", m[1][n]);
    }
 

4.分析

T(n)=O(n3)

5.原始碼

https://github.com/JessySnow/Algorithm/blob/master/src/T8/matrix.java