【1】动态规划基本步骤:
(1)找出最优解的性质,并刻划其结构特征。
(2)递归地定义最优值。
(3)以自底向上的方式计算出最优值。
(4)根据计算最优值时得到的信息,构造最优解。
【2】矩阵连乘问题
给定n个矩阵{A1,A2,A3,……,An},其中Ai与Ai+1是可乘的,i=1,2,3,…..,n-1.考察这n个矩阵的连乘积A1A2A3A4,…….,An.
若一个矩阵的连乘积德计算次序完全确定,也就是说该连乘积已经完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积。
void JZLC(int **a,int **b,int **c,int ra,int ca,int rb,int cb)
{
if(ca!=rb)
error("矩阵不可乘");
for(int i=0;i<ra;i++)
{
for(int j=0;j<cb;j++)
{
int sum=a[i][0]*b[0][j];
for(int k=1;k<ca;k++)
sum+=a[i][k]*b[k][j];
c[i][j]=sum;
}
}
}
完全加括号的矩阵连乘积可递归地定义为:
(1)单个矩阵是完全加括号的;
(2)矩阵连乘积A是完全加括号的,则A可表示为2个完全 加括号的矩阵连乘积B和C的乘积并加括号,即: A=(BC)
设有四个矩阵A,B,C,D ,它们的维数分别是:
A=50×10, B=10×40, C=40×30, D=30×5
总共有五种完全加括号的方式
(A((BC)D) (A(B(CD))) ((AB)(CD))
(((AB)C)D) ((A(BC))D)
16000, 10500, 36000, 87500, 34500
设计算A[i:j],1<=i<=j<=n,所需要的最少乘法次数m[i:j],则原问题的最优值为m[1,n]
当i=j时,A[i:j]=Ai,因此,m[i,i]=0,i=1,2,3,.....,n
当i<j时:m[i,j]=m[i,k]+m[k+1,j]+P(i-1)P(k)P(j),这里A的维数为P(i-1)*P(i)
k的位置只有j-i种可能。
Description
已知一组连乘矩阵的各维长度,要求计算并输出计算量最小的计算顺序表达式。
Input
每行为一组连乘矩阵的各维长度,行中第一个数字是连乘矩阵的个数n,n≤100,后面是n+1个维长。 矩阵个数为0表示输入结束。
Output
对每行输入,计算最优计算顺序,并以括号形式将计算表达式输出,各矩阵用A0, A1, ..的形式表示。
Sample Input
1 10 20
2 10 20 30
3 10 20 30 40
6 30 35 15 5 10 20 25
0
Sample Output
A0
A0A1
(A0A1)A2
(A0(A1A2))((A3A4)A5)
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int MAX=1010;
int p[MAX],m[MAX][MAX],s[MAX][MAX];
int n;
void MATRIX_CHAIN_ORDER()
{
for(int i=