标签:min 解析 algo targe 原则 tar 最小值 stat string
设A1,A2,A3,…,An为 n 个矩阵的序列,其中Ai为Pi-1*Pi阶矩阵,这个矩阵链的输入用向量P=<P0,P1,…,Pn>给出。
给定向量 P,确定一种乘法次序,使得基本运算的总次数达到最小。
蛮力法
枚举所有可能的乘法次序,针对每种次序计算基本运算的次数,从中找出具有最小运算次数的乘法次序,每一种乘法次序对应了一种 在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};
第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]);
}
T(n)=O(n3)
https://github.com/JessySnow/Algorithm/blob/master/src/T8/matrix.java
标签:min 解析 algo targe 原则 tar 最小值 stat string
原文地址:https://www.cnblogs.com/jessysnow/p/14920742.html