矩阵连乘的动态规划解法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32175379/article/details/73134418
  1. 写出矩阵连乘的自底向上非递归的动态规划算法 或自顶向下递归的动态规划
    算法(备忘录方法) 。
    输入: 先输入 矩阵连乘的 个数 n , 然后依次手动输入(! 不能随机生成! ) 矩阵的
    维数 pi) (数字) 。 注意,6 个矩阵,需输 7 个维数值。
    输出:矩阵连乘的次序,如 :((A1(A2A3))((A4A5A6)) 。
    示例:输入:6 30 35 15 5 10 20 25 ,输出:((A1(A2A3))((A4A5)A6))
package com.Test;
import java.util.Scanner;
public class second {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m[][] = new int[n + 1][n + 1];
        int s[][] = new int[n + 1][n + 1];
        int p[] = new int[n + 1];
        for (int i = 0; i < n + 1; i++) {
            p[i] = sc.nextInt();
        }
        jc(p, n, m, s);
        System.out.println(cx(1, n, s));


    }
    private static String cx(int i, int j, int[][] s) {
        // TODO 自动生成的方法存根
        if (i == j)
            return "A" + i;
        else
            return "(" + cx(i, s[i][j], s) + cx(s[i][j] + 1, j, s) + ")";
    }

    private static void jc(int[] p, int n, int[][] m, int[][] s) {
        // TODO 自动生成的方法存根
        for (int i = 1; i <= n; i++) {// 单个矩阵乘的次数为0
            m[i][i] = 0;
        }
        for (int r = 2; r <= n; r++) {// r为每次循环矩阵的长度。
            for (int i = 1; i <= n - r + 1; i++) {// 从1到n-r+1循环取矩阵长度r时的矩阵
                int j = r + i - 1;
                m[i][j] = m[i][i]+m[i + 1][j] + p[i - 1] * p[i] * p[j];// 取第一个可取位置,这里肯定是第一个,
                //例如对(A1~A2),则i=1,j=2,下面一行的m[1][2]=m[1][1]+m[2][2]+p[0]*p[1]*p[3],即A1A2
                //例如对(A2~A4),则i=2,j=4,下面一行的m[2][4]=m[2][2]+m[3][4]+p[1]*p[2]*p[4],即A2(A3A4)
                s[i][j] = i; // 断开位置为i
                for (int k = i + 1; k < j; k++) {//k是从i开始的,所以这里是i+1开始分段;然后,k<j,因为这里i,j表示的是Ai*Aj,这里只是分段成(Ai*Ak) + (Ak+1 *Aj)
                    //,所以K不能大于j
                    // 循环取K的可取位置
                    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;
                    }
                }
            }
        }
    }
}


参考自:
http://blog.csdn.net/tmljs1988/article/details/6925631
http://blog.sina.com.cn/s/blog_64018c250100s123.html
http://www.tuicool.com/articles/67Nz6f2

猜你喜欢

转载自blog.csdn.net/qq_32175379/article/details/73134418