您的位置:首页 > 其它

蓝桥杯 算法提高 矩阵乘法 (区间dp)

2017-04-04 22:45 519 查看
算法提高 矩阵乘法  

时间限制:3.0s   内存限制:256.0MB

   

问题描述
  有n个矩阵,大小分别为a0*a1, a1*a2, a2*a3, ..., a[n-1]*a
,现要将它们依次相乘,只能使用结合率,求最少需要多少次运算。

  两个大小分别为p*q和q*r的矩阵相乘时的运算次数计为p*q*r。
输入格式
  输入的第一行包含一个整数n,表示矩阵的个数。

  第二行包含n+1个数,表示给定的矩阵。
输出格式
  输出一个整数,表示最少的运算次数。
样例输入
3

1 10 5 20
样例输出
150
数据规模和约定
  1<=n<=1000, 1<=ai<=10000。

分析:区间dp,状态方程 :dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+a[i]*a[k+1]*a[j+1]);  //dp[i][j]表示从第i个矩阵到第j个矩阵的最少运算。

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
//const LL INF=(LL)1<<62;
#define INF (LL)1<<62 //注意数据比较大,要用long long 型
const int maxn=1000+10;
LL a[maxn];
LL dp[maxn][maxn];
int main(){
int n;
while(scanf("%d",&n)==1){
for(int i=1;i<=n+1;i++)
scanf("%lld",&a[i]);

for(int i=1;i<=n;i++)dp[i][i]=0;

for(int len=2;len<=n;len++){
for(int i=1;i<=n-len+1;i++){
int j=len+i-1;
dp[i][j]=INF;
for(int k=i;k<j;k++){
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+a[i]*a[k+1]*a[j+1]);
}
}
}

printf("%lld\n",dp[1]
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: