记录编号 241053 评测结果 AAAAA
题目名称 最优矩阵链乘 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 0.003 s
提交时间 2016-03-24 12:25:25 内存使用 0.33 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
int r[105];
int f[105][105];//f[i][j]:从i乘到j的最小花费 
int min(int a,int b){
	return a<b?a:b;
}
int main(){
	freopen("goodmatrix.in","r",stdin);
	freopen("goodmatrix.out","w",stdout);
	int n;scanf("%d",&n);
	n++;
	for(int i=1;i<=n;++i)scanf("%d",r+i);
	n--;
	memset(f,127,sizeof(f));
	for(int i=1;i<=n;++i){
		f[i][i]=0; 
	}
	for(int i=1;i<=n;++i){
		f[i][i+1]=r[i]*r[i+1]*r[i+2];
	}
	for(int k=2;k<n;++k){//枚举 区间长-1  
		for(int i=1;i+k<=n;++i){//i+k为区间终点
	 		int j=i+k;
			for(int p=i;p<j;++p){
			///	printf("f[%d][%d]=min(f[%d][%d],%d+%d+%d*%d*%d\n",\
			///	i,j,i,j,f[i][p],f[p+1][j],r[i],r[p+1],r[j+1]);
				f[i][j]=min(f[i][j],f[i][p]+f[p+1][j]+r[i]*r[p+1]*r[j+1]);
			}
		}
	}
	printf("%d",f[1][n]);
	fclose(stdin);fclose(stdout);
	return 0;
}