\documentclass[a4paper]{ctexart}
\usepackage{amssymb}%%导入数学包
\usepackage{amsmath}
\usepackage{indentfirst}
\usepackage{listings}
\usepackage{graphicx}
\usepackage{geometry}
\usepackage{color} %%设置字体的颜色
\author{软工1班 163XXX xxxx}
\title{算法设计第二次作业}
\begin{document}
\maketitle
\noindent {\color{blue}动态规划最优矩阵连乘问题:}
\hangafter=1\setlength{\hangindent}{0em}给定n个矩阵{A1,A2,…,An},其中Ai 与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少?
(1)现在给定矩阵连乘是由7个矩阵构成:
\begin{tabular}{|c|c|c|c|c|c|c|c|} %居中
\hline
% after \\: \hline or \cline{col1-col2} \cline{col3-col4} ...
矩阵 & A1 & A2 & A3 & A4 & A5 & A6 & A7 \\
\hline
行*列 & 30*35 & 35*15 & 15*5 & 5*10 & 10*20 & 20*25 & 25*10 \\
\hline
\end{tabular} \\
(2)P是用来存放各个矩阵的行的维数,对P的处理情况如下:
\begin{tabular}{|c|c|c|c|c|c|c|c|c|}
\hline
% after \\: \hline or \cline{col1-col2} \cline{col3-col4} ...
\hline
P的下标 & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 \\
\hline
P值 & 30 & 35 & 15 & 5 & 10 & 20 & 25 & 10 \\
\hline
\end{tabular} \\
(3)m[i][j]表示第i个矩阵至第j个矩阵这段的最优解,对其用值的大小来刻画。
(4)将矩阵连乘积 简记为A[i:j] ,这里i $\leqslant$ j.假设这个最优解在第k 处断开,i$\leqslant$k$<$j,则A[i:j]是最优的,那么A[i,k]和A[k+1:j] 也是相应矩阵连乘的最优解.
设计算A[i:j],1≤i≤j≤n,所需要的最少数乘次数m[i,j],则原问题的最优值为m[1,n] 。
当i=j时,A[i,j]=Ai, m[i,j]=0;(表示只有一个矩阵,如A1,没有和其他矩阵相乘,故乘的次数为0)
当i$<$j时,m[i,j]=min$\{$m[i,k]+m[k+1,j] +pi-1*pk*pj$\}$ ,其中 i$\leqslant$k$<$j。故有:
\begin{equation}
m[i][j]=
\begin{cases}
0,&{i=j} \\
\min
$\{${m[i][k]+m[k+1][j]+pi-1*pk*pj}$\}$ &{i<k<j} \\
\end{cases}
\end{equation}
(5)代码如下:
\lstset{escapeinside=``}
\begin{lstlisting}[language=java]
/**
*
* @author Mouse
*
*/
public class Main {
static int MatriNum = 7; // `表示矩阵链中矩阵的数目`
// `存放各个矩阵的行的维数`
static int[] p = { 30, 35, 15, 5, 10, 20, 25, 10 };
// `下面是通过数组的形式来表示矩阵的`
// `由于数组是从0开始标记的,我们默认从1处开始存储,故下面的MatriNum需要加1`
static int[][][] A = new int[MatriNum][][];// `存放要进行连乘的多个矩阵`
// `用来存放Ai到Aj的最少乘次数`
static int[][] m = new int[MatriNum + 1][MatriNum + 1];
// `用来存放Ai到Aj的最后断开位置`
static int[][] s = new int[MatriNum + 1][MatriNum + 1];
// `创建矩阵a,维数为m*n 随机数填充数组内容`
public static void CreatMatrix(int[][] a, int m, int n) {
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
a[i][j] = (int) Math.round(Math.random() * 50) - 10;
}
// `输出连乘的所有矩阵`
public static void printAllM() {
for (int i = 0; i < MatriNum; i++) {
System.out.println("A" + (i + 1) + ": "
+ A[i].length + "*"+ A[i][0].length);
printM(A[i]);
}
}
// `输出单个矩阵的值`
public static void printM(int[][] a) {
for (int i = 0; i < a.length; i++) {
System.out.print(" ");
for (int j =
动态规划最优矩阵连乘问题
最新推荐文章于 2020-04-19 13:38:48 发布