问题描述:
一个n*m矩阵由n行m列共n*m个数排列而成。两个矩阵A和B可以相乘当且仅当A的列数等于B的行数。一个N*M的矩阵乘以一个M*P的矩阵等于一个N*P的矩阵,运算量为nmp。
矩阵乘法满足结合律,A*B*C可以表示成(A*B)C或者是A(B*C),两者的运算量却不同。例如当A=2*3 B=3*4 C=4*5时,(A*B)C=64而A(B*C)=90。显然第一种顺序节省运算量。
现在给出N个矩阵,并输入N+1个数,第i个矩阵是a[i-1]*a[i]。
输入:
第一行n(n<=100)
第二行n+1个数
输出:
最优的运算量
样例输入:
3
2 3 4 5
样例输出:
64
代码:
#include<stdio.h>
2 int min(int a,int b)
3 {
4 return a<b?a:b;
5 }
6 int main()
7 {
8 int n,p[105],f[105][105];
9 while(scanf("%d",&n)&&n)
10 {
11 int i,j,k;
12 for(i=0;i<=n;i++)scanf("%d",&p[i]);
13 for(i=1;i<=n;i++)
14 {
15 for(j=0;j<=n;j++)f[i][j]=1<<30;
16 f[i][i]=0;
17 f[i][i+1]=p[i-1]*p[i]*p[i+1];
18 }
19 for(k=2;k<=n;k++)
20 for(i=1;i<=n-k;i++)
21 for(j=0;j<k;j++)
22 f[i][i+k]=min((f[i][i+j]+f[i+j+1][i+k]+p[i-1]*p[i+j]*p[i+k]),(f[i][i+k]));
23 printf("%d\n",f[1][n]);
24 }
25 return 0;
26 }