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

题意:给出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-

你可能感兴趣的:(矩阵)