矩阵链乘法,动态规划java实现

1:代码:最小括号化方案,动态规划方程

                  0        如果i=j     

 m[i,j]  ={

                   min[i,k]+m[k+1,j]+pi-1pkpj          如果  i<j  

子问题涉及到子问题起始点和终止点 i , j 的 ,要用三层for循环。

第一层循环代表子问题的长度。

第二层for循环代表 子问题的 起始点。

第三层for循环在  子问题起始点和终止点之间找一个最优的分割点。 需用到动态规划公式。

package com.li.chapter15.class02;

/**
 * 矩阵链乘法:使用动态规划方法
 */
public class JuZhenLianChengFa {

    public static void main(String[] args){
        int[] p={30,35,15,5,10,20,25};  //p.length-1个矩阵
        matrixChainOrder(p);
    }

    public static void matrixChainOrder(int[] p) {  //p个矩阵,要用p.length+1个数字来表示。例如两个矩阵相乘要用p0*p1*p2表示,p1是p0的列,p2的行
        int[][] m = new int[p.length-1][p.length-1];   //保存
//        int[][] s = new int[p.length - 1][p.length-1];

        for (int i = 0; i < m.length; i++) {
            m[i][i]=0;  //矩阵链长度为0时,乘积为0,m[j][j+0];
        }

        //p.length=3;
        for (int i = 1; i < p.length - 1; i++) {  // i 矩阵链的长度
            for (int j = 0; j < p.length-i-1; j++) {  //j从0到p.lenght-i-1,子问题的起始点   计算长度为i的矩阵链,所有的最优值。
                m[j][j+i]=Integer.MAX_VALUE;   //最大值。
                for (int k = j; k < j+i; k++) {   //求j到j+i这段长度乘积的最小值,  k是分割点
                    int value = m[j][k] + m[k + 1][j + i] + p[j]*p[k+1] * p[j+i+1];  //k为分割点时,乘积的大小
                    if (value < m[j][j + i]) {
                        m[j][j+i]=value;
//                        s[j][j + i]=k;  //j到j+i这段矩阵链最优分割点为 k
                    }
                }
            }
        }


        for (int i = 0; i < m.length; i++) {
            for (int j = 0; j < m[1].length; j++) {
                System.out.print(m[i][j]+"             ");
            }
            System.out.println("");
        }
        System.out.println(m[1][4]);
    }
}

猜你喜欢

转载自www.cnblogs.com/liyafei/p/9125797.html
今日推荐