题目描述:
给定n个矩阵,求这n个矩阵相乘的最小计算次数
其中矩阵相乘的次数计算为:
A1*A2=A1的行*A1的列*A2的列(A1的列保证=A2的行)
输入格式:
第一行为矩阵个数n(n<=100),以后第二行至n+1行为第i个矩阵的行与列
输出格式:
输出最小相乘次数
想法:
设f[i][j]为第i个矩阵乘到第j个矩阵的最小相乘次数
那么我们可以很简单的得到:f[i][j]=min(f[i][k]+f[k+1][j])(k∈[i,j])
那要怎么得到每一个f[i][k]和f[k+1][j]的值呢
开始的时候我的想法是将f数组定义为结构体,f[i][j].x为第i个矩阵乘到第j个矩阵结果的行,f[i][j].y为结果的列,最后用f[i][j].ans储存答案。
一秒钟后我就发现了这个想法非常捞,不仅麻烦而且是错的,会影响DP过程中每一步的结果
所以我们在读入的时候采用a[i][i].x和a[i][i].y来储存第i个矩阵的行和列,状态转移方程就写为:
f[i][j]=min(f[i][k]+f[k+1][j]+a[i][k].x*a[i][k].y*a[k+1][j].y)
然后如果f[i][j]被更新了,就将a[i][j].x赋值为a[i][k].x,a[i][j].y赋值为a[k+1][j].y,这可以用一个简单的if语句做到
最后附上代码:
#include<bits/stdc+