码迷,mamicode.com
首页 > 其他好文 > 详细

NYOJ 536 开心的mdd【矩阵链乘】

时间:2015-03-30 22:56:31      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:

题意:给出n个矩阵组成的序列,问最少的运算量

看的紫书: dp[i][j]表示从第i个矩阵到第j个矩阵最少的乘法次数

dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+p[i-1]*p[k]*p[j]);

 

边界条件为dp[i][i]=0,因为从一个矩阵自己到它自己不需要做乘法 然后把dp[i][j]初始化为一个极大的值,再来求最小值

 

学习的这一篇:http://blog.csdn.net/dgq8211/article/details/7492186

还有这一篇:http://blog.csdn.net/u012804490/article/details/26152337

技术分享
 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath> 
 5 #include<stack>
 6 #include<vector>
 7 #include<map> 
 8 #include<set>
 9 #include<queue> 
10 #include<algorithm>  
11 #define mod=1e9+7;
12 using namespace std;
13 
14 
15 typedef long long LL;
16 const int maxn=105;
17 const int INF = 0x7fffffff;
18 int dp[maxn][maxn],p[maxn];
19 
20 int main(){
21     int n,i,j,ans,k,len;
22     while(scanf("%d",&n)!=EOF&&n){
23         for(i=1;i<=n;i++) cin>>p[i-1]>>p[i];
24         
25         memset(dp,0,sizeof(dp));
26         
27         for(len=1;len<n;len++){ //连乘的矩阵的长度 
28             for(i=1;i<=n-len;i++){ //连乘的矩阵的起点 
29                 j=i+len; 
30                 dp[i][j]=INF;
31                 for(k=i;k<j;k++){ //连乘的矩阵的终点 
32                     dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+p[i-1]*p[k]*p[j]);
33                   //  printf("dp[%d][%d]=%d\n",i,j,dp[i][j]);
34                 }                
35             }
36         }
37         printf("%d\n",dp[1][n]);        
38     }
39     return 0;
40 }
View Code

 

 

 

 

 

 

 

 

 

go---go---go-

NYOJ 536 开心的mdd【矩阵链乘】

标签:

原文地址:http://www.cnblogs.com/wuyuewoniu/p/4379300.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!