版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32175379/article/details/73134418
- 写出矩阵连乘的自底向上非递归的动态规划算法 或自顶向下递归的动态规划
算法(备忘录方法) 。
输入: 先输入 矩阵连乘的 个数 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