| | | | 描述 Description | | | 一个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] | | | |
| | | | 输入格式 Input Format | | | 第一行n(n<=100) 第二行n+1个数 | | | |
| | | | 输出格式 Output Format | | | 最优的运算量 | | | |
| | | | 时间限制 Time Limitation | | | 各个测试点1s
| |
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f[110][110];
int main()
{
int n;
int a[110];
while(scanf("%d",&n)==1)
{
for(int i=1;i<=n+1;i++) scanf("%d",&a[i]);
memset(f,0,sizeof(f));
for(int r=1;r<=n;r++)
{
for(int i=1;i+r<=n;i++)
{
int j=i+r;
f[i][j]=f[i+1][j]+a[i]*a[i+1]*a[j+1];
for(int k=i;k<j;k++)
{
int t=f[i][k]+f[k+1][j]+a[i]*a[k+1]*a[j+1];
if(t<f[i][j]) f[i][j]=t;
}
}
}
printf("%d/n",f[1][n]);
}
return 0;
}